没有解压的 40GB tar.gz 文件中的行数?

Posted

技术标签:

【中文标题】没有解压的 40GB tar.gz 文件中的行数?【英文标题】:Number of rows in 40GB tar.gz file without uncompressing it? 【发布时间】:2016-08-28 08:43:35 【问题描述】:

我在https://ghtstorage.blob.core.windows.net/downloads/mysql-2016-06-16.tar.gz 有超过 40 GB 的 tar.gz 文件 如何在不解压缩可能超过 100 GB 的整个文件的情况下找到压缩在此 tar.gz 文件中的 CSV 文件中的行数?

【问题讨论】:

您是否正在寻找专门在 Python 中执行此操作的方法? 您不能,但您可能希望制作人将那条信息添加到名称中,这样您就不必自己弄清楚了。 要计算行数,您需要在某个时候解压缩文件的每个部分。不过,您也许可以分块处理它,而不是一次解压缩整个文件。选择适合内存的块大小,文件大小不是问题。这就是您要的(如何分块处理.tar.gz 文件)? 是的,我需要在 Python @Juhana 中完成。 @Blckknght:如何解压缩 .tar.gz 文件,读取数据,然后以迭代方式将其写入 CSV? 【参考方案1】:

如果该 tar.gz 中只有一个 csv 文件,您可以将其作为 bash one-liner:

tar -zxOf mysql-2016-06-16.tar.gz | wc -l

它使用 tar 将存档中的所有文件提取到标准输出(-O,大写 o,不为零),并使用 wc 来计算行数。

如果有更多文件,并且只想要一个文件,您可以像这样计算该文件中的行数:

tar -zxOf mysql-2016-06-16.tar.gz mysql-2016-06-16/commit_comments.csv| wc -l

以下是列出存档中所有文件的方法:

tar -zlf mysql-2016-06-16.tar.gz

CSV 文件通常有一个标题,因此每个文件删除一行即可获得行数。

【讨论】:

【参考方案2】:

无需解压缩可能超过 100 GB 的整个文件

我想你的意思是不先将文件解压到磁盘。这是实现此目的的 Python 方法:

import tarfile as tf
import gzip as gz
from StringIO import StringIO
infile = '/path/to/mysql-2016-06-16.tar.gz'
def linecount(infile, member):
    lc = 0
    with gz.GzipFile(infile) as zipf:
        with tf.TarFile(fileobj=zipf) as tarf:
            dataf = tarf.extractfile(member)
            while dataf.readline():
               lc += 1 
            dataf.close()       
    return lc
print linecount(infile, 'test.csv')

它说“找不到文件名'test.csv'”。

要知道 tar 文件有哪些成员:

def listmembers(infile):
    with gz.GzipFile(infile) as zipf:
        with tf.TarFile(fileobj=zipf) as tarf:
            return list(m.name for m in tarf)  

统计 tarfile 中所有文件的行数:

for member in listmembers(infile):
    print member, linecount(infile, member)

在开始之前,know how tar files are structured 会很有用。

【讨论】:

这是执行即时解压缩还是提取到临时文件中? 这是内存中的动态解压。 感谢@miraculixx 提供代码。我想,我快到了,但它说“找不到文件名'test.csv'”。我是 Python 新手 :(。接下来我该怎么做? 我可以告诉你,但我认为你会从实际思考我非常完整的示例代码中受益更多。你在正确的轨道上。 提示:我实际上并没有下载你的文件,我自己创建了tar.gz 并包含了一个test.csv 好的,我会尽量理解。感谢分享详细代码@miraculixx。实际上,我在 2 周前学习了 Python,并且正在向你们学习。非常感谢您的耐心等待!

以上是关于没有解压的 40GB tar.gz 文件中的行数?的主要内容,如果未能解决你的问题,请参考以下文章

(Python)尽可能快地计算一个巨大(> 10GB)文件中的行数[重复]

在 Windows 中解压 tar.gz

java里怎么解压tar.gz文件啊,网上好多例子都不行

windows下解压tar.gz文件

如何在不解压的情况下将 gz 文件合并为 tar.gz?

Ubuntu中的解压缩文件的方式