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

6 投票
3 回答
9396 浏览
提问于 2025-04-17 09:47

我现在在PiCloud上有一个项目,涉及到多次迭代的常微分方程求解器。每次迭代都会生成一个大约有30行和1500列的NumPy数组,每次的结果都会添加到之前结果的底部。

通常情况下,我会让这些比较大的数组直接由函数返回,保存在内存中,然后一次性处理它们。但是,PiCloud对函数返回的数据大小有比较严格的限制,以控制传输成本。这没问题,但这就意味着我得启动成千上万的任务,每个任务只处理一次迭代,这样开销很大。

看起来最好的解决办法是把输出写入一个文件,然后用他们提供的另一个函数来收集这个文件,这个函数没有传输限制。

我最好的选择是把数据直接存到CSV文件里吗?我应该在每次迭代时都往CSV文件里添加数据,还是等到最后再把所有数据一次性写入?我是不是漏掉了什么特别聪明的办法?

3 个回答

2

我建议你看看 pickle 模块。这个 pickle 模块可以把 Python 对象变成一串字节流(比如字符串)。这样你就可以把这些对象写入文件,或者通过网络发送出去,之后再把它们重新变回来。

2

试试 Joblib - 快速压缩持久化

Joblib 的一个关键功能是它可以保存任意的 Python 对象,并且能非常快速地读取回来。对于那些主要使用 numpy 数组的容器来说,它特别高效。实现这种快速的诀窍是将 numpy 数组保存在单独的文件中,然后通过内存映射的方式加载它们。

编辑: 关于 Joblib 中数据持久化的更新(2016)博客文章

9

除非有特别的原因让中间文件需要人类可读,否则不要使用CSV格式,因为这样做会不可避免地导致精度损失。

最有效的方法可能是使用tofile文档),这个方法适合在你提前知道数据所有属性的情况下,快速将文件写入磁盘。

如果你想要一种与平台无关但特定于numpy的保存方式,可以使用save文档)。

Numpy和scipy还支持各种科学数据格式,比如HDF5,如果你需要数据的可移植性,可以考虑使用这些格式。

撰写回答