おそらく、この関数を変更してリストにデータを追加してもメモリエラーが発生しないようにする方法を探しています。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[:]
'list_11'と' list_22'を作成してから 'list_1'と' list_2'と比較するのではなく、ワークブックの行を繰り返し処理するときに 'list_1'と' list_2'をチェックします。これにより、人口全体で2つのリストが削除され、多くのメモリが節約されます。つまり、32ビットでRAM =。プロセスの4GB制限に達したように思えます。上記があなたのニーズに合わない場合は、サブプロセスで作業することもできます。 –
この2つの追加リストの理由は、このスプレッドシートにいくつかの数値データがあることです。たとえば、この関数に渡す2つのリストの日付とこれらの新しいリストの日付を比較する必要があります。 equal(またはforループからの条件に基づいて)、新しいリストに数値を追加します。私は私の説明を複雑にしたくないと思っています:) –