高效的方法将大型NumPy数组写入文件

6
我目前在PiCloud上运行一个涉及ODE求解器的多次迭代项目。每次迭代会产生一个约30行1500列的NumPy数组,每个迭代结果都会附加到先前结果的数组底部。
通常,我会让这些相当大的数组由函数返回,将它们保存在内存中,并一次性处理它们。但是,PiCloud对函数返回的数据大小有相当严格的限制,以减少传输成本。这没问题,但这意味着我必须启动数千个作业,每个作业运行一个迭代,这会带来相当大的开销。
最好的解决方案似乎是将输出写入文件,然后使用另一个没有传输限制的函数收集该文件。
我的最佳选择是将其转储到CSV文件中吗?我应该每次迭代都添加到CSV文件中,还是将所有内容保存在数组中,最后只写一次?我是否遗漏了什么非常聪明的方法?
3个回答

9
除非中间文件需要人类可读,否则不要使用CSV,因为这将不可避免地导致精度损失。
最有效的方法可能是使用tofiledoc),它旨在快速转储文件到磁盘,当您预先知道数据的所有属性时使用。
对于平台无关但特定于numpy的保存,可以使用savedoc)。
如果需要可移植性,则Numpy和Scipy还支持各种科学数据格式,如HDF5。

它们并没有必要可读性强 - 只是习惯使用CSV文件来移动数据集,其中精度并不是一个因素(大多数事情都是整数)。这似乎就是我正在寻找的。 - Fomite

2

我建议您查看pickle模块。 pickle模块允许您将Python对象序列化为字节流(例如,字符串)。 这使您可以将它们写入文件或通过网络发送,然后稍后重新实例化对象。


1
使用cPickle代替pickle,它速度更快。 - Martlark
pickle适用于即时使用,但在需要跨Python版本移植时不应使用它(它不向后兼容,即3.x无法读取2.x pickle的二进制数据,尽管文档可能会说)。请使用numpy本地的npy格式。(http://bugs.python.org/issue6784) - staticd

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接