gpt4 book ai didi

python - 处理巨大的 bz2 文件

转载 作者:行者123 更新时间:2023-12-01 02:52:33 25 4
gpt4 key购买 nike

我应该使用 python 处理一个巨大的 bz2 文件(5+ GB)。使用我的实际代码,我总是遇到内存错误。在某个地方,我读到可以使用 sqlite3 来处理这个问题。这是正确的吗?如果是,我应该如何调整我的代码?(我使用 sqlite3 的经验不是很丰富...)

这是我的代码的实际开头:

import csv, bz2

names = ('ID', 'FORM')

filename = "huge-file.bz2"

with open(filename) as f:
f = bz2.BZ2File(f, 'rb')
reader = csv.DictReader(f, fieldnames=names, delimiter='\t')
tokens = [sentence for sentence in reader]

在此之后,我需要检查“ token ”。如果我能处理这个巨大的 bz2 文件,那就太好了 - 所以,非常欢迎任何帮助!非常感谢您的任何建议!

最佳答案

文件很大,读取所有文件将不起作用,因为您的进程将耗尽内存。

解决方案是以 block /行的形式读取文件,并在读取下一个 block 之前对其进行处理。

列表理解线

tokens = [sentence for sentence in reader]

正在将整个文件读取到 token ,这可能会导致进程内存不足。

csv.DictReader可以逐行读取CSV记录,这意味着每次迭代时,都会将1行数据加载到内存中。

像这样:

with open(filename) as f:
f = bz2.BZ2File(f, 'rb')
reader = csv.DictReader(f, fieldnames=names, delimiter='\t')
for sentence in reader:
# do something with sentence (process/aggregate/store/etc.)
pass

请注意,如果在添加的循环中,再次将sentence中的数据存储在另一个变量(如tokens)中,仍然可能会消耗大量内存,具体取决于关于数据有多大。因此,最好将它们聚合起来,或者使用其他类型的存储来存储该数据。

更新

关于在您的流程中使用之前的一些行(如评论中所述),您可以执行以下操作:

然后您可以将前一行存储在另一个变量中,该变量在每次迭代时都会被替换。

或者,如果您需要多行(返回),那么您可以获得最后 n 行的列表。

如何

使用 collections.deque使用 maxlen 来跟踪最后 n 行。从文件顶部的 collections 标准模块导入 deque

from collections import deque

# rest of the code ...

last_sentences = deque(maxlen=5) # keep the previous lines as we need for processing new lines
for sentence in reader:
# process the sentence
last_sentences.append(sentence)

我建议使用上述解决方案,但您也可以使用列表自己实现它,并手动跟踪其大小。

在循环之前定义一个空列表,在循环结束时检查列表的长度是否大于您需要的长度,从列表中删除较旧的项目,然后追加当前行。

last_sentences = [] # keep the previous lines as we need for processing new lines
for sentence in reader:
# process the sentence
if len(last_sentences) > 5: # make sure we won't keep all the previous sentences
last_sentences = last_sentences[-5:]
last_sentences.append(sentence)

关于python - 处理巨大的 bz2 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44586747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com