Python 高效地删除列表的第一个元素

Python 高效地删除列表的第一个元素,python,memory,memory-management,out-of-memory,Python,Memory,Memory Management,Out Of Memory,我正在写一个程序,可以阅读数百万篇学术论文摘要,并从中收集一些数据。我一直都有内存不足的问题,我已经缩小了几乎所有我能做到的 我的下一个想法是在我的程序看完后从内存中删除一个摘要。这是我的循环: for i in range(0, len(abstracts)): abstract = abstracts[i] name = abstract.id self.Xdict[name] = self.Xdata.getData(abstract)

我正在写一个程序,可以阅读数百万篇学术论文摘要,并从中收集一些数据。我一直都有内存不足的问题,我已经缩小了几乎所有我能做到的

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

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
任何帮助都会很棒


谢谢大家!

如果可能,您可以像10 Gb数据一样拆分摘要,先读取1 Gb数据,然后再处理1 Gb数据,这样处理起来很容易,而且不会花费太多时间和内存来释放与
O(1)
中每个摘要相关的内存

abstracts[i] = None
处理后;这将只保留一个指针,速度非常快

不过,最好不要提前阅读所有的摘要,除非你真的需要,因为问题中没有具体说明的原因


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

顺便说一句,删除第一个元素是
pop(0)
。谢谢,我会尝试一下。您已经找到了
del abstracts[0]
abstracts.pop(0)
已在评论中提到。但我认为你问错了问题!当处理大量数据时,正如您所发现的,您不应该一次将其全部保存在内存中。在您的情况下,我将尝试的第一件事是迭代您的“摘要”,而不将它们全部保存在列表(或任何其他内存数据结构)中。例如,如果一个文本文件中的每一行都是一行,您可以使用
在open('path/to/file.txt',r'):…
,而不是首先将整个文件的内容读取到内存中。将处理过程分批进行,而不是将它们全部添加到一个巨大的列表中如何?此外,
pop(0)
O(N)
,如果您希望在数据结构的结尾和结尾处快速删除,请查看。此外,我建议使用库来显示进度,而不是使用
sys.stdout.write();sys.stdout.flush()
无处不在。