使用大型数组 - Numpy

5
我的情况如下:
1. 我有大约 7000 万个整数值分布在不同的文件中,针对 ~10 种数据类别(确切数字未知)。 2. 我读取这些多个文件,并创建一些 Python 对象来存储数据。这会涉及逐行读取每个文件并将其附加到 Python 对象中。因此,我将得到一个包含 7000 万个子数组的数组,每个子数组有 10 个值。 3. 我对这些数据进行一些统计处理。这将涉及向每行数据添加几个值(例如百分位数)。 4. 我将此对象存储在数据库中。
现在我从未处理过这种规模的数据。我的第一个想法是使用 Numpy 来更高效地处理数组内存。但是我听说在 Numpy 数组中,“append” 操作不鼓励使用,因为它不太高效。
那么你建议我使用什么呢?有关处理这种规模数据的一般提示吗?如果需要,我可以通过随机抽样将数据减少到其大小的 20%。

大约70百万。70什么?70百万字节的数据?70百万个数据点?70个缩写为“mil”的东西?您能详细说明一下吗? - user2357112
2
@Korem,使用pandas如何解决内存存储问题?Pandas使用numpy,因此pandas结构会增加额外的开销,从而增加内存使用量。这里的想法是尽可能地创建您的结构一次,逐行增长它们是低效的。您的问题有点广泛,但这可能会有所帮助:https://dev59.com/cmYq5IYBdhLWcg3wtCzO - EdChum
@Korem “我的第一反应是使用Numpy来获得更高效的数组,以便在内存方面更加节省空间。” 我理解这句话的意思是内存占用小等于更节省空间。对于逐行添加数据,Pandas仍然会遇到与Numpy相同的问题。但是,这个问题缺乏细节。 - EdChum
2
是的,我并不关心内存中的实际大小,因为这是不可能避免的。我的主要关注点是对一个大型numpy数组进行'append'操作。 - user1265125
1
你有考虑过预先分配一个 Numpy 数组,然后再为其赋值吗? my_array = numpy.zeros(length); for i, line in enumerate(file): ... my_array[i] = ... - log0
显示剩余4条评论
1个回答

5
如果我正确理解了您的描述,您的数据集将包含大约7亿个整数。即使您使用64位整数,这仍然只有约6GB。根据您拥有多少RAM以及您想要进行的统计处理方面的操作,您的数据集听起来可以作为普通的numpy数组存储在核心内存中,并且是相当容易管理的。
如果数据集过大无法放入内存,一个简单的解决方案可能是使用内存映射数组(numpy.memmap)。在大多数方面,np.memmap 数组的行为类似于普通的 numpy 数组,但是它不是将整个数据集存储在系统内存中,而是根据需要动态地从/写入磁盘上的文件中读取/写入。

另一个选择是将数据存储在 HDF5 文件中,例如使用 PyTablesH5py。HDF5 允许在磁盘上对数据进行压缩,并且 PyTables 包含一些非常快速的方法,可以对大型基于磁盘的数组执行数学操作。


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