N=10000000
fin=open("sth.bin","rb")
data = struct.unpack('dddddd......',fin.read(8*N)) #of course not working, but this is what I want
fin.close()
答案 0 :(得分:5)
迭代文件,一次解压块:
with open("sth.bin", "rb") as f:
numbers = [
struct.unpack('d', chunk)[0]
for chunk in iter(lambda: f.read(8), "")
]
你可以在这里进行一系列的优化 - 一次读取更大的文件块(4096字节通常是理想的)并创建compiled Struct - 但这是一般的想法。如果性能特别重要,您还可以一次解压缩多个双打(例如struct.unpack('d' * 8, chunk)
)以减少函数调用次数:
numbers = []
struct_4096 = struct.Struct("d" * 4096 / 8)
with open("sth.bin", "rb") as f:
while True:
chunk = f.read(4096)
try:
numbers.extend(struct_4096.unpack(chunk))
except struct.error:
numbers.extend(struct.unpack("d" * len(chunk) / 8))
答案 1 :(得分:3)
struct支持计数的格式,例如以下代码将解包100个双打:
import struct
struct.unpack("100d", string)
如果你正在处理大量的双打,我建议你使用numpy:
np.fromfile(f, dtype=float, count=100)
将从文件中创建一个100双数组。