【问题标题】:Python - Search for items in hundreds of large, gzipped filesPython - 在数百个大型 gzip 文件中搜索项目
【发布时间】:2011-05-27 03:19:22
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你的问题是......?
  • 糟糕。你发布就像我编辑它一样。 :)
  • 正如 Andrew 所说,您需要在此处实际指定一个问题,但通常我敢打赌,处理语言不是您的问题,而是磁盘访问速度将成为一个重要的限制因素。
  • 您是否根据处理单个文件所需的时间来估算时间,还是您在猜测?
  • 嗨,凯西——在这一点上,我不记得使用单个文件执行此操作需要多长时间,但即使对于包含 4 克的单个文件,这也意味着搜索每个文件其中包括 3-gram、bigram 和 unigram。我什至不确定哪种数据结构使用起来最快。

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


【解决方案1】:

提供几行和预期输出的示例会有所帮助。但据我了解,这里有一些想法。

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

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

【讨论】:

  • 谢谢!没错,我正在寻找以下形式的输出:“a b c d : 10 20 30 40 5 4 3 2 1 1”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2013-04-27
相关资源
最近更新 更多