将浮点数组保存为ASCII
我需要把一个长度为5亿的浮点数数组转换成一个ASCII文件。用循环来做这个事情太慢了。我在想有没有更快的方法。
我用了一个标准的循环:NumSamples是2亿;dataword是一个包含2亿个值的向量。
NumSamples=len(dataword)
for i in range(1,NumSamples):
MyAscii=str(dataword[i])+"\n"
fout.write(MyAscii)
使用的编程语言是Python。
1 个回答
2
试着把写入操作分批进行,这样就不需要每写4个字节就调用一次 fout.write
:
from itertools import batched
BATCH_SIZE = 1000
samples = iter(dataword)
# Skip first entry, like in the original code.
next(samples)
for batch in batched(samples, BATCH_SIZE):
# Join 'BATCH_SIZE' floats in one string before writing it to file.
MyAscii='\n'.join(map(str, batch))
fout.write(MyAscii)
这样的话,每写1000个浮点数才会调用一次 fout.write
,这会在内存中存储1000个浮点数的字符串(占用的内存可以忽略不计)。一般来说,尽量使用最大的 BATCH_SIZE
,只要不让内存用完就行。
或者,如果你使用的是3.12版本之前的Python,没有 itertools.batched
,这里有一个手动实现的版本:
BATCH_SIZE = 1000
NumSamples=len(dataword)
for batch_i in range(1,NumSamples,BATCH_SIZE):
# Account for sample number not being divisible by batch size.
limit = min(NumSamples, batch_i+BATCH_SIZE)
# Join 'BATCH_SIZE' floats in one string before writing it to file.
MyAscii='\n'.join(str(dataword[i]) for i in range(batch_i, limit))
fout.write(MyAscii)