繁体   English   中英

Python - 在数百个大型 gzip 文件中搜索项目

[英]Python - Search for items in hundreds of large, gzipped files

不幸的是,我正在处理一个非常大的语料库,该语料库分布在数百个.gz 文件中——事实上,价值 24 GB(打包)。 Python 真的是我的母语(哈哈),但我想知道我是否没有遇到需要学习“更快”语言的问题?

每个.gz 文件包含一个纯文本文档,压缩后大约 56MB,解压缩后大约 210MB。

每行是一个 n-gram(二元、三元、四元等),右边是一个频率计数。 我需要创建一个文件来存储每个四边形的 substring 频率及其全串频率计数(即 4 个一元频率、3 个二元频率和 2 个三元频率,总共 10 个数据点)。 每种类型的 n-gram 都有它自己的目录(例如,所有的二元组都出现在它们自己的 33.gz 文件集中)。

我知道一个简单的蛮力解决方案,以及要导入哪个模块来处理 Python 中的 gzip 文件,但我想知道是否有什么东西不需要我花费数周的 CPU 时间? 任何有关加快此过程的建议,无论多么轻微,都将不胜感激!

有几行的例子和预期的 output 会有所帮助。 但据我了解,这里有一些想法。

您当然不希望每次处理单个文件或更糟糕的是单个 4-gram 时都处理所有文件。 理想情况下,您将 go 通过每个文件一次。 所以我的第一个建议是维护一个中间频率列表(这些 10 个数据点的集合),它们首先只考虑一个文件。 然后,当您处理第二个文件时,您将更新您遇到的项目的所有频率(并可能添加新项目)。 然后你会继续这样,随着你发现更多匹配的 n-gram 增加频率。 最后把一切都写出来。

更具体地说,在每次迭代中,我都会将一个新的输入文件读入 memory 作为字符串到数字的 map,其中字符串是空格分隔的 n-gram,数字是它的频率。 I would then process the intermediate file from the last iteration, which would contain your expected output (with incomplete values), eg "ab c d: 10 20 30 40 5 4 3 2 1 1" (kind of guessing the output you are looking这里)。 对于每一行,我会在 map 中查找我的 map 中的所有子语法,更新计数,并将更新后的行写出到新的 output 文件中。 那个将在下一次迭代中使用,直到我处理完所有输入文件。

暂无
暂无

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

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