如何保存大数组以便在python中占用更少的内存?

时间:2013-09-10 17:41:50

标签: python numpy

我是python的新手。我有一个大数组,a,其大小如(43200, 4000),我需要保存它,因为我需要将其用于将来的处理。当我尝试用np.savetxt保存它时,txt文件太大而我的程序遇到内存错误,因为我需要处理相同大小的5个文件。有没有办法保存庞大的数组,以便占用更少的内存?

感谢。

2 个答案:

答案 0 :(得分:11)

将数据保存到文本文件效率非常低。 Numpy有内置的保存命令savesavez/savez_compressed,它们更适合存储大型数组。

根据您计划使用数据的方式,您还应该查看HDF5格式(h5py或pytables),它允许您存储大型数据集,而无需将其全部加载到内存中。

答案 1 :(得分:4)

您可以使用PyTables创建分层数据格式(HDF)文件来存储数据。这提供了一些有趣的内存选项,可以将您正在使用的对象链接到它保存的文件。

以下是另一个StackOverflow问题,演示了如何执行此操作:"How to store a NumPy multidimensional array in PyTables."

如果您愿意将数组作为Pandas DataFrame对象使用,您还可以将Pandas接口用于PyTables / HDF5,例如:

import pandas
import numpy as np
a = np.ones((43200, 4000)) # Not recommended.
x = pandas.HDFStore("some_file.hdf")

x.append("a", pandas.DataFrame(a)) # <-- This will take a while.
x.close()

# Then later on...
my_data = pandas.HDFStore("some_file.hdf") # might also take a while
usable_a_copy = my_data["a"] # Be careful of the way changes to
                             # `usable_a_copy` affect the saved data.

copy_as_nparray = usable_a_copy.values

对于此大小的文件,您可以考虑是否可以使用并行算法执行应用程序,并且可能仅应用于大型数组的子集,而不是在继续之前需要使用所有数组。