【发布时间】:2017-10-08 17:47:34
【问题描述】:
我使用openpyxl 和numpy 来读取大型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