2

我正在实现一个工具,它可以解析大量以 bz2 格式压缩的 248GB 文件。平均压缩因子为 0.04,因此事先将它们解压缩到超过 6 TB 是完全不可能的。

内容文件的每一行都是一个完整的 JSON 记录,所以我使用 bz2 模块读取文件,open然后使用for line in bz2file套索,它工作得很好。问题是我不知道如何显示任何进度度量,因为我不知道我读取了多少压缩字节,也不知道每个文件中有多少记录。文件很大。有些高达 24 GB。

你会如何处理这个问题?

4

1 回答 1

0

朴素的方法

你可以像这样使用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)

这样你就不会检查你的文件两次,但你仍然必须弄清楚每行有多少字节。

于 2021-06-09T19:05:23.557 回答