【发布时间】:2016-04-16 15:08:13
【问题描述】:
我正在编写一个程序,它可以读取数百万份学术论文摘要并从中收集一些数据。我一直遇到内存不足的问题,并且几乎尽我所能缩小规模。
我的下一个想法是在我的程序读完摘要后从内存中删除它。这是我的循环:
for i in range(0, len(abstracts)):
abstract = abstracts[i]
name = abstract.id
self.Xdict[name] = self.Xdata.getData(abstract)
self.Ydict[name] = self.Ydata.getData(abstract)
sys.stdout.write("\rScanned Papers: %d" % count) #A visual counter
sys.stdout.flush()
count += 1
sys.stdout.write("\rScanned Papers: %d" % count)
sys.stdout.flush()
这是我的代码,没有任何从内存中删除项目的方法。我目前尝试使用:
del abstracts[0] # This is too slow
abstracts = abstracts[1:] # This is way too slow
abstract = abstracts.pop(0) # Doesn't seem to free up any memory
任何帮助都会很棒。
谢谢!
【问题讨论】:
-
顺便说一句,删除第一个元素是
pop(0)。 -
谢谢,我试试看。
-
你已经找到了
del abstracts[0],并且在cmets中已经提到了abstracts.pop(0)。但我认为你问错了问题!正如您所发现的,在处理大量数据时,您不应该一次将其全部保存在内存中。在您的情况下,我会尝试的第一件事是迭代您的“摘要”而不将它们全部保存在列表中(或任何其他内存数据结构)。例如,如果每个都是文本文件中的一行,您可以使用for abstract in open('path/to/file.txt', 'r'): ...而不是首先将整个文件的内容读入内存。 -
如何分批拆分处理而不是将它们全部添加到一个巨大的列表中?此外,
pop(0)是O(N),如果您要在数据结构的开始和结束处寻找快速删除,请查看collections.deque。 -
另外我建议使用
tqdm库来显示进度,而不是到处使用sys.stdout.write(); sys.stdout.flush()。
标签: python memory memory-management out-of-memory