【问题标题】:numpy fails to resize large matrixnumpy 无法调整大矩阵的大小
【发布时间】:2017-10-08 17:47:34
【问题描述】:

我使用openpyxlnumpy 来读取大型excel 文件。代码看起来像

W = load_workbook(fname, read_only = True)
p = W.worksheets[0]
a=[]
m = p.max_row
n = p.max_column
for row in p.iter_rows():
    for k in row:
        a.append(k.value)

# convert list a to matrix (for example 5*6)
aa= np.resize(a, [m, n])

对于中等大小的文件(4MB excel 文件,16000 行和 50 列),它们可以正常工作。但是对于大文件(21B,100000 行和 50 列),numpy 会因内存错误而失败。系统上有可用内存。

1- 调整矩阵大小时如何找到占用的内存量?

2- 如何增加内存(类似于 java 中的堆大小)?

Traceback (most recent call last):
  File "exread.py", line 26, in <module>
    aa= np.resize(a, [m, n])
  File "C:\Users\m.naderan\AppData\Local\Programs\Python\Python36\lib\site-packa
ges\numpy\core\fromnumeric.py", line 1121, in resize
    a = ravel(a)
  File "C:\Users\m.naderan\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\fromnumeric.py", line 1468, in ravel
    return asanyarray(a).ravel(order=order)
  File "C:\Users\m.naderan\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\numeric.py", line 583, in asanyarray
    return array(a, dtype, copy=False, order=order, subok=True)
MemoryError

【问题讨论】:

  • resize 的这种用法有什么意义?很少需要它。使用 np.array 从列表中创建一个数组。
  • 好吧,我认为它会巧妙地将数组大小调整为 m*n。所以请让我知道如何使用np.array./
  • 您可以只使用aa = np.array([[i.value for i in j] for j in p.rows]),而不是前两行以外的所有内容。
  • @Nyps:对不起,我不明白。您能否在答案中解释该语句的确切作用?
  • 像这样:W = load_workbook(fname, read_only = True)p = W.worksheets[0]aa = np.array([[i.value for i in j] for j in p.rows]) 作为您的整个代码。

标签: python numpy out-of-memory openpyxl


【解决方案1】:
  1. 如果您在 Unix 系统上,检查操作的内存使用情况最实用的方法可能是只观察 top/htop。 5 年前有人确实在此发布了 Python solution

  2. 我可能错了,但我认为默认情况下对 Python 内核的内存使用没有限制,即MemoryErrors 真的只有当你的内存确实没有足够的可用内存时才会发生整个系统(我之前运行过消耗超过 50GB 内存的脚本)。

【讨论】:

    【解决方案2】:

    文档包含clear example of how to convert a worksheet to a dataframe。这比你自己的代码更容易使用和更可靠,为什么不使用它呢?

    【讨论】:

    • 例子不清楚。对数据框的需求是什么,为什么我们应该使用它,如果我们不使用它会发生什么?我只想逐行读取单元格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2013-10-11
    • 2014-01-10
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多