Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以增量方式构建numpy阵列并测量内存使用情况_Python_Numpy_Memory Management - Fatal编程技术网

Python 以增量方式构建numpy阵列并测量内存使用情况

Python 以增量方式构建numpy阵列并测量内存使用情况,python,numpy,memory-management,Python,Numpy,Memory Management,我有一系列大型文本文件(高达1G),它们是一个实验的输出,需要用Python进行分析。它们最好加载到2D numpy数组中,这提出了第一个问题: 由于在加载开始时行数未知,如何 一个非常大的numpy阵列是否能够以最高效的方式逐行构建 简单地将行添加到数组中在内存方面是低效的,因为两个大型数组会暂时共存。如果使用numpy.append,似乎也会出现同样的问题。堆栈函数很有前途,但理想情况下,我希望在适当的位置增加阵列 这引出了第二个问题: 观察一个非常复杂的Python程序的内存使用情况

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

  • 由于在加载开始时行数未知,如何 一个非常大的numpy阵列是否能够以最高效的方式逐行构建
简单地将行添加到数组中在内存方面是低效的,因为两个大型数组会暂时共存。如果使用
numpy.append
,似乎也会出现同样的问题。
堆栈
函数很有前途,但理想情况下,我希望在适当的位置增加阵列

这引出了第二个问题:

  • 观察一个非常复杂的Python程序的内存使用情况的最佳方法是什么 使用numpy数组
为了研究上面的问题,我使用了常用的内存分析工具—heapy和Pypler—但我只获取外部数组对象(80字节)的大小,而不获取它们所包含的数据。除了粗略测量Python进程使用了多少内存之外,我如何才能在数组增长时得到数组的“完整”大小


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

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


你最好的选择可能是。从源代码看,随着项目数量的增加,数组每次都会扩展50%多一点。如果您可以很容易地获得行数(比如通过计算行数),您甚至可以传递一个计数。

一个可能的选择是先对文件进行一次传递,以计算行数,而不加载行数

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

  • 您将只重新分配内存日志(n)次,其中n是行数
  • 您只需要比最大表大小多50%的ram

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

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

    见:

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

    见:www.pytables.org/moin/HowToUse


    祝你好运

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

    谢谢大家。考虑到文件的大小,我不愿意仅仅为了数行而进行初始传递,但这似乎是解决内存问题的最简单、最有效的方法。最近,我有一位同事问了一个类似的问题,我想出了另一种可能,可以使您从初始传递中解脱出来。如果知道文件中“元素”的大致大小,可以将其划分为文件大小。为安全起见,添加一些填充,然后可以写入整个内存。要隐藏额外的、未初始化的元素,可以使用仅包含数据的元素的视图。你需要确保你没有过去。它并不完美,但如果文件读取速度慢,并且数据布局一致,那么它可能会起作用。