【发布时间】:2018-08-16 18:38:29
【问题描述】:
我需要一个高效的解决方案来将大量数据写入二进制文件。目前我使用 numpy 方法.tofile,它消耗了大部分运行时。我的 MWE:
import numpy as np
def writeCFloat(f, ndarray):
np.asarray(ndarray, dtype=np.float32).tofile(f)
def writeCInt(f, ndarray):
np.asarray(ndarray, dtype=np.int32).tofile(f)
def writeC80(f, string):
np.asarray(string, dtype='a80').tofile(f)
if __name__ == "__main__":
f = open('test.out', mode='wb')
ndarray = np.zeros((10000,10000))
writeCInt(f, ndarray)
writeCFloat(f, ndarray)
writeC80(f, 'coordinates')
那么有没有比当前解决方案更有效的方法呢?提前致谢。
【问题讨论】:
-
考虑到您的代码中没有显式循环,并且
asarray的文档说如果输入已经是 ndarray,则不执行复制。,我想没有更快的方法。 -
为什么当前的解决方案太慢了?您是否有基准表明 python 可以实现更高的 IO 率,或者这是一个需要实时写入大量数据的脚本?
-
感谢您的回复。我目前正在做的是读取一个大型二进制文件(~40 Gb),然后将数据写回另一个二进制文件。我分析了python脚本,发现大部分时间都花在
.tofile上。所以我想知道通过将数组、字符串等写入二进制文件的替代方法是否有改进的空间? -
也许
dask适合您?一般来说,并行性可以让您加快速度,那么问题是您将如何实现它,但这取决于您的用例的细节。 -
我也觉得不错。您还可以考虑 pandas 提供的各种选项(如 HDF、羽毛或镶木地板)和 dask。
标签: python pandas numpy binary dask