【问题标题】:Most efficient array for working with strings [closed]处理字符串的最有效数组[关闭]
【发布时间】:2017-07-07 16:48:32
【问题描述】:

我有一个大约 6 亿字的语料库。我想把它变成一个字符串列表,然后使用它,但我担心使用 6 亿个元素的列表会很慢。我想知道 Python 中的列表(单词)是否有高性能等效项。

更新:

我想在为它们计算一些分数后将每个单词映射到两个标签之一。分数基本上是一个分数,其中分子是它们在某些环境中出现的频率(例如,在某些特定单词之前),分母是它们的整体语料库频率。这几乎就是我心目中的任务。

【问题讨论】:

  • “合作”究竟意味着什么?如前所述,这个问题有点笼统。
  • Python 可能不是处理这么大的数据集的语言。
  • 这取决于,如果你想计算字母或聚类单词,或自动翻译..,也许你给更多的解释
  • 如果您要计算它们,迭代地处理它们(因此您不会一次将所有它们作为单独的字符串存储在内存中)可以正常工作。如果您需要更专业的数据结构方面的帮助,您需要向我们提供您想要做什么的信息。
  • 因此您的数据结构将只包含唯一的单词,您不需要一次读取所有数据。您几乎可以通过 dict 和分块(逐行,最简单)阅读来天真地实现它,它会工作得很好。根本不可能有 6 亿字的列表,您的驻留大小将只有兆字节。

标签: python arrays performance list nlp


【解决方案1】:

这真的归结为您的用例以及您想用“6 亿字”做什么。

如果您绑定到 Python,请查看 Dask.distributeddispy。然而,正如 intboolstring 所述,Python 可能不是您的最佳选择。

作为替代方案,带有 Hadoop 之类的 MapReduce 是处理大量数据的好方法。您没有真正解释您的应用程序环境,因此很难提供很多见解。

【讨论】:

  • 这是一个内存中的数据集,真的很可能是大材小用。
  • 我已按要求为问题添加了更多详细信息。
  • 您的数据集未来会增长吗?我认为会的,因为您可能会使用不同的语料库。以什么速度?你的程序对单词的处理速度有什么要求吗?这是一个你只会运行一次的操作吗?现在操作清晰了,但是环境有点模糊。
【解决方案2】:

@shadowranger 是对的,你应该告诉我们更多关于你想做什么的细节。这些是我的建议。

  • 首先,检查您的代码并找出问题的瓶颈,而不是仅仅猜测。如果您想做的不是 I/O 绑定,也许多处理是一个不错的选择。

  • 数据结构是一个非常重要的因素。如果你想处理大对象,最好的办法是选择最合适的数据结构。也许你可以试试deque,它是一个类似列表的容器,具有快速追加和在任一端弹出而不是 list

双端队列是堆栈和队列的概括(名称是 发音为“deck”,是“double-ended queue”的缩写)。双端队列 支持线程安全、内存高效的追加和弹出 在双端队列的一侧具有大致相同的 O(1) 性能 任一方向。

  • 内存管理,如果数据量很大,试着围绕generatorsiterators来构造这段代码,而不是大量的项目列表,这将帮助你避免内存耗尽并提高你的代码。

  • mmap 可能会帮助您处理大文件。

内存映射文件对象的行为既像字符串又像文件 对象。

High-performance container datatypes查看更多详情。

【讨论】:

  • 已添加详细信息!
猜你喜欢
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多