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

时间:2011-05-27 03:19:23

标签: python gzip large-files large-data-volumes corpus

不幸的是,我正在处理一个非常庞大的语料库,这个语料库分散到数百个.gz文件中 - 实际上是24千兆字节(打包)。 Python真的是我的母语(哈)但是我想知道我是否遇到了一个需要学习“更快”语言的问题?

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

每一行都是n-gram(bigram,trigram,quadrigram等),右边是频率计数。我需要基本上创建一个文件,存储每个四字组的子串频率以及它的整串频率计数(即4个单字节频率,3个双字母频率和2个三字母频率,总共10个数据点)。每种类型的n-gram都有自己的目录(例如,所有的bigrams都出现在他们自己的33 .gz文件集中。)

我知道一个简单,强力的解决方案,以及要导入哪个模块以使用Python中的gzip压缩文件,但我想知道是否有一些东西不会花费我几周的CPU时间?关于加快这一过程的任何建议,无论多么轻微,都会非常感激!

1 个答案:

答案 0 :(得分:1)

有几行和预期输出的例子会很有帮助。但据我所知,这里有一些想法。

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

更具体地说,在每次迭代中,我会将一个新的输入文件读入内存,作为字符串到数字的映射,其中字符串是空格分隔的n-gram,数字是它的频率。然后,我将处理上一次迭代的中间文件,该文件将包含您的预期输出(具有不完整的值),例如, “a b c d:10 20 30 40 5 4 3 2 1 1”(猜测你在这里寻找的输出)。对于每一行,我会在地图中查找地图中的所有子图,更新计数,并将更新的行写出到新的输出文件中。那个将在下一次迭代中使用,直到我处理完所有输入文件。