11

我有一系列需要在 Python 中分析的实验输出的大型文本文件(最多 1 gig)。最好将它们加载到 2D numpy 数组中,这提出了第一个问题:

  • 由于在加载开始时行数是未知的,如何才能最有效地逐行构建一个非常大的 numpy 数组?

简单地将行添加到数组中在内存方面效率低下,因为两个大数组会暂时共存。如果您使用numpy.append. 这些stack功能很有希望,但理想情况下,我希望将阵列扩大到位。

这就引出了第二个问题:

  • 观察大量使用 numpy 数组的 Python 程序的内存使用情况的最佳方法是什么?

为了研究上述问题,我使用了常用的内存分析工具——heapy 和 pymler——但我只获得了外部数组对象的大小(80 字节),而不是它们包含的数据。除了粗略地测量 Python 进程正在使用多少内存之外,随着数组的增长,我如何才能获得数组的“完整”大小?

本地详细信息:OSX 10.6、Python 2.6,但欢迎使用通用解决方案。

4

4 回答 4

7

除了创建一个最大可能大小的空数组(numpy.empty)然后在最后使用它的视图之外,没有办法确保您可以在适当的位置增长数组。您不能从小处着手,因为无法保证您可以在不破坏其他数据的情况下扩展地图的任何内存。(而且所有这些都比 python 允许您从解释器内部获取的级别低得多。)

你最好的选择可能是numpy.fromiter。看源码,随着项目数量的增加,数组每次扩展50%多一点。如果您可以轻松获得行数(例如通过计算行数),您甚至可以将其传递给计数。

于 2009-10-07T21:14:40.317 回答
2

您是否尝试过使用 memmap 文件?您可以遍历输入文件(如果可能,以块的形式)并转换传入的数据并将它们作为行插入到内存映射的 numpy 数组中。不利的一面是,如果主内存不足并且需要从交换中进行分页,则会产生更多的磁盘 i/o。

请参阅:http ://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

另一种选择是 PyTables。您需要构建一些特殊的类似 sql 的表,但它相当简单。事实上,它为您的数据提供了透明的磁盘持久性(自动序列化)和分层组织。它还限制了使用的主内存量。

请参阅:www.pytables.org/moin/HowToUse

祝你好运!

于 2011-01-12T07:05:17.053 回答
1

一个可能的选项是先通过文件进行单次传递以计算行数,而不加载它们。

另一种选择是每次将表大小加倍,这有两个好处:

  1. 您只会重新分配内存 log(n) 次,其中 n 是行数。
  2. 您只需要比您最大的表大小多 50% 的内存

如果您采用动态路由,您可以测量第一行的长度(以字节为单位),然后通过计算(文件中的字节数/第一行中的字节数)来猜测行数。从这个大小的桌子开始。

于 2009-10-07T21:32:59.703 回答
0

问题本质上是文本文件。当您的输入数据存储在更高级的来源中时,可以避免此类问题。以h5py 项目为例。首先将数据转换为 HDF5 文件,然后对 HDF5 文件运行分析脚本是值得的。

于 2013-02-12T11:13:06.917 回答