有效删除列表的第一个元素

时间:2016-01-12 05:35:06

标签: python memory memory-management out-of-memory

我正在编写一个程序,读取数百万张acedemic纸张摘要并从中收集数据。我一直遇到内存耗尽的问题,并且已经缩减了我所能做的一切。

我的下一个想法是在程序读完后从内存中删除一个摘要。这是我的循环:

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

任何帮助都会很棒。

谢谢!

2 个答案:

答案 0 :(得分:0)

要释放O(1)中与每个摘要关联的内存,您可以

abstracts[i] = None

处理后;这将保持一个指针,并将非常快。

然而,更好的是甚至不会提前阅读所有摘要,除非你真的需要那些未在问题中指明的原因。

另请注意,支持从序列两端快速追加/删除元素的Python数据结构是deque,而不是列表。

答案 1 :(得分:-2)

如果可能你可以将你的抽象分解为10 Gb数据首先读取1 gb处理它和接下来1 gb就像它将处理简单并且不会花费太多时间和内存