【问题标题】:Memory-efficient 2d growable array in python?python中内存高效的2d可增长数组?
【发布时间】:2017-12-28 05:52:16
【问题描述】:

我正在开发一个处理大量数据的应用程序。

.... 并且一直运行我的计算机内存不足。 :(

Python 在变量上有大量内存开销(根据 sys.getsizeof())。例如,一个包含一个整数的基本元组占用 56 个字节。一个空列表,64 个字节。严重的开销。

Numpy 数组非常适合减少开销。但它们并非旨在高效增长(请参阅Fastest way to grow a numpy numeric array)。 Array (https://docs.python.org/3/library/array.html) 看起来很有希望,但它是 1d。我的数据是 2d 的,一个数组的行数和列宽为 3 个浮点数(理想情况下为 float32),另一个数组的列宽为两个整数(理想情况下为 uint32)。显然,使用约 80 字节的 python 结构来存储每行 12 或 8 字节的数据将消耗我的内存。

是在 Python 中降低内存使用以“伪造”2d 的唯一现实方法吗,也就是通过将数组寻址为 arr[row*WIDTH+column] 并将行计数为 len(arr)/WIDTH?

【问题讨论】:

  • 在numpy中创建数组的方法有很多。你的数据来自哪里?您是在计算它、从套接字读取它、从 CSV 文件中提取它,还是...?
  • 整数、浮点数、字节、字符串?
  • @Austin:我正在用 json 文件中的正则表达式解析它。一些点和线在处理过程中被丢弃,但文件很大。 wwii:我提到了问题中的数据类型——最好是 float32 和 uint32。

标签: python arrays memory out-of-memory


【解决方案1】:

根据您的 cmets,我建议您将任务分为两部分:

1) 在第 1 部分中,使用正则表达式解析 JSON 文件并生成两个简单格式的 CSV 文件:没有标题,没有空格,只有数字。这应该是快速和高效的,没有内存问题:读入文本,写出文本。不要试图在记忆中保留任何你不是绝对需要的东西。

2) 在第 2 部分中,使用 pandas read_csv() 函数直接插入 CSV 文件。 (是的,pandas!您可能已经掌握了它,而且速度非常快。)

【讨论】:

  • 其实这是个好主意;当需要重新运行处理时(通常在初始调试期间!),它将节省大量时间。谢谢! (只要 pandas 返回的数据结构是内存高效的 :))
  • 为了记录,我跳过了 pandas - 在搞砸了一段时间后,我得出的结论是 numpy 的 genfromtxt 要好得多。
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2013-04-22
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多