2017-02-10 58 views
0

我正在尋找一種方法來修改此功能,以便將數據附加到列表中不會產生內存錯誤。Python(追加列表時出現內存錯誤)

我有一個程序逐行讀取一個文件,並根據一些條件(該文件將有超過1000000行)將此文件中的數據寫入文本文件。我有追加幾個列表(它們很長)的函數,然後我將列表中的數據逐行寫入文本文件。

如果文件達到最大行數(1000000),我將它分割。 它工作得很好,但我需要下面的函數附加一個額外的列表(我修改了這個例子)和當我追加0到else語句列表0,它會產生一個內存錯誤。我使用的是64位操作系統,Windows 10(RAM 16GB)並使用Python 2.7(32位) - 但是分割文件的方法通常對我無效,所以我不知道是不是我更喜歡我只需通過修改循環即可解決問題。

謝謝你的任何建議!

# This function writes data to the lists based on the given conditions.* 

def get_new_list(workbook, list_1, list_2, list_equal_values): 


    worksheet1 = workbook.sheet_by_name('SomeWorksheet') 

    list_11 = [] 
    list_22 = [] 
    list_new_values = [] 

    # Get data from the worksheet and append to the lists. 
    for row in range(1, worksheet1.nrows): 
     value_11 = worksheet1.cell(row, 0).value 
     value_22 = worksheet1.cell(row, 1).value 
     new_value = worksheet1.cell(row, 10).value 

     list_11.append(value_11) 
     list_22.append(value_22) 
     list_new_values.append(new_value) 


    # Compare values from list_1, list_2 to values in list_11 and list_22. 
    for index in range(len(list_1)): 
     for i in range(len(list_11)): 
      if str(list_1[index]) == str(list_11[i]) \ 
       and str(list_2 [index]) == str(list_22[i]): 
       value = list_new_values[i] 
       list_equal_values.insert(index, value) 

      elif str(list_1[index]) == str(list_11[i]) \ 
        and str(list_2 [index]) != str(list_22[i]): 
          value = list_new_values[i] 
         list_equal_values (index, value) 

      **else: 
      # He is the problem, Memory Error, but I need to append 0 
      # if the first two conditions are not met** 
       list_equal_values.append(0) 

    return list_equal_values 
     # I empty the lists in case the file is split and new data is sent to this  function. 
    del list_11[:] 
    del list_22[:] 
    del list_new_values[:] 
+1

而不是創建'list_11'和'list_22',然後迭代它們來比較'list_1'和'list_2',你可以在迭代工作簿的行時檢查'list_1'和'list_2'。這將刪除整個人羣中的兩個列表併爲您節省大量內存。據說,這聽起來像是你已經達到了4GB的內存限制。= 32位。如果上述內容不符合您的需求,您也可以使用子流程。 –

+0

這兩個額外列表的原因是這個電子表格有一些數字數據,例如,我需要比較兩個列表中的日期,我將這些列表中的日期與這些新列表中的日期進行比較,如果它們是等於(或基於for循環的條件),然後我將數字追加到新列表中。希望我不會把我的解釋複雜化:) –

回答

0

問題不在於你的for-loops。這與你的陣列越來越大越來越大。嘗試刪除所有不必要的數組或附加內容,以提高內存效率。

如果這是不可能的,你可以嘗試將部分結果存儲在文件中,但這可能是混亂的。

如果你想要一個簡單的解決方案,我記得我以前有過類似的問題。經過一番研究,我發現如果我切換到Python 2.7(64位)......問題解決了!

希望它有幫助!我記得我花了很多時間弄清楚這一點,所以不要犯同樣的錯誤

+0

您可能對32位的4gb限制是正確的,但是我們是否可以在「添加更多的內存分配」之前首先解決代碼中正確使用列表的需求? –

+0

謝謝!我也玩過這個for循環,並且沒有遍歷內部for循環(或者僅僅是爲了例如:對於a,b in zip(list_1,list_2),它可以工作 - 但我當然會錯過一些數據,因爲它總是但正如你所說,它可能會變得凌亂:)另外,上次更新到64沒有幫助我出於某種原因,但我有更大的文件的方式:)我會嘗試再次更新,並感謝您指出你做了一個研究 - 爲我節省了時間:) –