繁体   English   中英

Python 3 bz2 大文件和进度

[英]Python 3 bz2 huge file and progress

我正在实现一个工具,它可以解析大量以 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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM