2017-05-10 90 views
0

我使用openpyxlnumpy来读取大型excel文件。代码看起来像numpy无法调整大矩阵

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文件),他们工作得很好。但是,对于大文件(具有100000行和50列的21B),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 
+0

这个使用'resize'有什么意义?这是很少需要的。使用np.array从列表中创建一个数组。 – hpaulj

+0

嗯,我认为它会整齐地将数组大小调整为m * n。所以,请让我知道如何使用'np.array'。/ – mahmood

+1

您可以使用'aa = np.array([[i.value for i in j] for j in p.rows])''而不是其他任何东西前两行。 – Nyps

回答

0
  1. 最实用的方法来检查操作的内存使用量将可能是只是看top/htop如果你是一个Unix系统。有人在5年前发布了一个Python solution

  2. 我可能是错的,但我认为这是在默认情况下一个Python内核的内存使用量没有限制,即MemoryError真的只有当真正没有足够的可用内存你的整个系统上发生(我已经运行了超过50GB内存的脚本)。

0

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

+0

这些例子不清楚,数据帧的需求是什么,为什么我们应该使用它,如果我们不使用它,会发生什么?我只想逐行读取单元格 – mahmood