Python(追加列表时出现内存错误)
我正在寻找一种方法来修改这个函数,这样在列表中添加数据不会产生内存错误 我有一个程序,可以逐行读取一个文件,并根据某些条件将该文件中的数据写入文本文件(该文件将有超过1000000行)。我有一些函数附加几个列表(它们很长),然后我将列表中的数据逐行写入文本文件 如果文件达到最大行数(1000000),我将拆分它它工作正常,但是我需要下面的函数来附加一个额外的列表(我在本例中对其进行了修改),并且当我在else语句中将0附加到列表时,它会产生一个内存错误 我使用64位操作系统、Windows10(RAM 16GB)和Python2.7(32位)-但是拆分文件的方法通常对我来说是有效的,不需要更新任何东西,这就是为什么我想知道是否可以通过修改循环来解决问题 谢谢你的建议Python(追加列表时出现内存错误),python,Python,我正在寻找一种方法来修改这个函数,这样在列表中添加数据不会产生内存错误 我有一个程序,可以逐行读取一个文件,并根据某些条件将该文件中的数据写入文本文件(该文件将有超过1000000行)。我有一些函数附加几个列表(它们很长),然后我将列表中的数据逐行写入文本文件 如果文件达到最大行数(1000000),我将拆分它它工作正常,但是我需要下面的函数来附加一个额外的列表(我在本例中对其进行了修改),并且当我在else语句中将0附加到列表时,它会产生一个内存错误 我使用64位操作系统、Windows10(
# 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[:]
问题不在于循环。您的阵列越来越大。尝试删除所有不必要的数组或附件,以提高内存效率 如果不可能,您可以尝试将部分结果存储在文件中,但这可能会造成混乱 如果你想要一个简单的解决方案,我记得我很久以前也遇到过类似的问题。经过大量的研究,我发现如果我切换到Python 2.7(64位)。。。问题解决了
希望有帮助!我记得我花了很多时间弄清楚这一点,所以不要犯同样的错误,而不是创建
list_11
和list_22
,然后迭代它们,与list_1
和list_2
进行比较,你可以在迭代工作簿的行时检查list_1
和list_2
。这将删除完整填充中的两个列表,并为您节省大量内存。话虽如此,听起来您已经达到了内存进程的4GB限制。如果上述内容不符合您的需要,您也可以使用子流程。这两个附加列表的原因是,此电子表格包含一些数字数据,例如,我需要将传递给此函数的两个列表中的日期与这些新列表中的日期进行比较,以及它们是否相等(或者基于for循环的条件),然后我将数字添加到新列表中。希望我的解释不会复杂化:)您可能对32位4gb限制是正确的,但我们能否在“添加更多内存分配”之前先解决代码中正确使用列表的需要?谢谢!我也玩过这个for循环,没有迭代内部for循环(或者只是做一些例子:对于zip中的a,b(list_1,list_2),它是有效的-但是当然我错过了一些数据,因为它总是相同的组合。但是正如你所说,它可能会变得混乱:)而且,由于某种原因,上次更新到64并没有帮助我,但我有更大的文件:)我会再次尝试更新它,感谢您指出您对此进行了研究-节省了我的时间:)