我正在实现一个工具,它可以解析大量以 bz2 格式压缩的 248GB 文件。平均压缩因子为 0.04,因此事先将它们解压缩到超过 6 TB 是完全不可能的。
内容文件的每一行都是一个完整的 JSON 记录,所以我使用 bz2 模块读取文件,open
然后使用for line in bz2file
套索,它工作得很好。问题是我不知道如何显示任何进度度量,因为我不知道我读取了多少压缩字节,也不知道每个文件中有多少记录。文件很大。有些高达 24 GB。
你会如何处理这个问题?
我正在实现一个工具,它可以解析大量以 bz2 格式压缩的 248GB 文件。平均压缩因子为 0.04,因此事先将它们解压缩到超过 6 TB 是完全不可能的。
内容文件的每一行都是一个完整的 JSON 记录,所以我使用 bz2 模块读取文件,open
然后使用for line in bz2file
套索,它工作得很好。问题是我不知道如何显示任何进度度量,因为我不知道我读取了多少压缩字节,也不知道每个文件中有多少记录。文件很大。有些高达 24 GB。
你会如何处理这个问题?
你可以像这样使用tqdm:
from tqdm import tqdm
with open("hugefile.bz2", "r") as bz2file:
for line in tqdm(bz2file, desc="hugefile"):
...
通过这种方式,您将知道您在多少时间内处理了多少行。但是,如果您想获得流程中的百分比,则需要事先知道文件中有多少行。
如果你不知道,你可以这样计算:
from tqdm import tqdm
total = 0
with open("hugefile.bz2", "r") as bz2file:
for line in bz2file:
total += 1
with open("hugefile.bz2", "r") as bz2file:
for line in tqdm(bz2file, desc="hugefile", total=total):
...
但这意味着要检查文件两次,因此您可能不想这样做。
另一种方法是使用以下方法确定您正在阅读的行有多少字节:https ://stackoverflow.com/a/30686735/8915326
并将其与总文件大小相结合
import os
from tqdm import tqdm
hugefile = "hugefile.bz2"
with open(hugefile, "r") as bz2file:
with tqdm(desc=hugefile, total=os.path.getsize(hugefile)) as pbar:
for line in bz2file:
...
linesize = len(line.encode("utf-8"))
pbar.update(linesize)
这样你就不会检查你的文件两次,但你仍然必须弄清楚每行有多少字节。