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

use*_*019 9 python numpy

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

谢谢.

hac*_*day 11

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

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


ely*_*ely 4

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

这是另一个 StackOverflow 问题,演示了如何执行此操作:“如何在 PyTables 中存储 NumPy 多维数组”。

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

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
Run Code Online (Sandbox Code Playgroud)

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