2017-02-10 11 views
0

おそらく、この関数を変更してリストにデータを追加してもメモリエラーが発生しないようにする方法を探しています。Python(リストを追加するときのメモリエラー)

ファイルを1行ずつ読み込み、いくつかの条件に基づいてこのファイルからテキストファイルにデータを書き込むプログラムがあります(ファイルの行数は1000000を超えます)。私はいくつかのリストを追加する(長いです)関数を持っていて、リストからテキストファイルに行単位でデータを書き出します。

ファイルが最大行数(1000000)に達すると、ファイルを分割します。 else文のリストに0を追加すると、という追加のリスト(この例では変更したもの)とを追加する必要がありましたが、メモリエラーが発生します。

私は64ビットOS、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'をチェックします。これにより、人口全体で2つのリストが削除され、多くのメモリが節約されます。つまり、32ビットでRAM =。プロセスの4GB制限に達したように思えます。上記があなたのニーズに合わない場合は、サブプロセスで作業することもできます。 –

+0

この2つの追加リストの理由は、このスプレッドシートにいくつかの数値データがあることです。たとえば、この関数に渡す2つのリストの日付とこれらの新しいリストの日付を比較する必要があります。 equal(またはforループからの条件に基づいて)、新しいリストに数値を追加します。私は私の説明を複雑にしたくないと思っています:) –

答えて

0

問題はあなたのfor-loopsではありません。あなたのアレイはますます大きくなります。不要な配列や追加をすべて削除して、より効率的なメモリを使用してください。

部分的な結果をファイルに保存しようとする可能性がありますが、それは面倒なことがあります。

シンプルなソリューションが必要な場合は、前と同じような問題があったことを思い出します。私はPython 2.7(64ビット)に切り替えた場合、問題が解決したことを理解しました。

希望すると助かります!私はこれを理解するのに多くの時間を費やしたので覚えていますので、同じミスをしないでください

+0

32ビットで4GBの制限を満たしているかもしれませんが、「メモリ割り当てを追加する」前にコード内のリストを適切に使用する必要性に取り組むことはできますか? –

+0

ありがとうございました!私もこのforループを使っていましたが、inner forループを反復することなく(または単に例として:a、bのzip(list_1、list_2)を実行しても動作しますが、しかし、あなたが言ったように、それは乱雑になることができます:)また、64に更新するいくつかの理由で私を助けていない最後の時間が、私は方法が大きなファイルを持っていた:)私は再びそれを更新しようとし、あなたはこれについての研究をしたと思います。 –

関連する問題