Richard,
you could use NumericArray to reduce storage and then export the list with DumpSave.
byteArray =
NumericArray[RandomInteger[{0, 30}, 300 * 10^6], "UnsignedInteger8"]
ByteCount[byteArray]
Timing[DumpSave["test.mx", byteArray]]
On my machine the 300M Integers are written in no time to the HDD and the size of the mx file is less than 300 MByte (file size was corrected). See Richards table