Python – 在数百个大型gzip压缩文件中搜索项目
作者:互联网
不幸的是,我正在处理一个非常大的语料库,它实际上已经传播到数百个.gz文件中 – 价值24千兆字节(打包). Python真的是我的母语(哈)但是我想知道我是否还没遇到过需要学习“更快”语言的问题?
每个.gz文件包含一个纯文本的单个文档,大约56MB gzip压缩,大约210MB解压缩.
每一行都是n-gram(bigram,trigram,quadrigram等),右边是频率计数.我需要基本上创建一个文件,存储每个四字组的子串频率以及它的整串频率计数(即4个单字节频率,3个双字母频率和2个三字母频率,总共10个数据点).每种类型的n-gram都有自己的目录(例如,所有的bigrams都出现在他们自己的33个.gz文件集中).
我知道一个简单,强力的解决方案,以及导入哪个模块使用Python中的gzip压缩文件,但我想知道是否有一些东西不会花费我几周的CPU时间?关于加快这一过程的任何建议,无论多么轻微,都将非常感谢!
解决方法:
这将有助于得到几行和预期输出的例子.但据我所知,这里有一些想法.
您当然不希望每次处理单个文件时处理所有文件,或者更糟糕的是,只需要一个4克.理想情况下,您需要浏览一次文件.所以我的第一个建议是维护一个中间频率列表(这些10个数据点集),它们首先只考虑一个文件.然后,当您处理第二个文件时,您将更新您遇到的项目的所有频率(并且可能会添加新项目).那么你会继续这样做,增加频率,因为你发现更多匹配的n-gram.最后写出一切.
更具体地说,在每次迭代时,我会将一个新的输入文件读入内存,作为字符串到数字的映射,其中字符串是,例如,空格分隔的n-gram,数字是它的频率.然后,我将处理上一次迭代的中间文件,该文件将包含您的预期输出(具有不完整的值),例如, “a b c d:10 20 30 40 5 4 3 2 1 1”(猜测你在这里寻找的输出).对于每一行,我会在地图中查找地图中的所有子图,更新计数,并将更新的行写出到新的输出文件中.那个将在下一次迭代中使用,直到我处理完所有输入文件.
标签:python,large-files,gzip,corpus,large-data-volumes 来源: https://codeday.me/bug/20190710/1419553.html