【问题标题】:Processing lots of data in python, should I use multiple threads/processes?在 python 中处理大量数据,我应该使用多个线程/进程吗?
【发布时间】:2014-02-21 23:43:54
【问题描述】:

我正在编写一个程序来处理一个巨大的文件(~1.5GB)。我在具有相当不错的 cpu(8 核)的 Windows 7 计算机上运行 Python 2.7。以任何方式使用多个线程或进程会更有效吗?截至目前,处理整个事情大约需要一个小时。它每秒处理大约 1000 个数据条目,总共处理超过 400 万个。

【问题讨论】:

  • 有没有一种简单的方法可以从文件的中途开始? (取决于文件结构)处理文件的某些部分是否依赖于其他部分?如果您可以划分输入,并且每个部分都是独立的,那么您可能会通过将其分成最多(2 * 个核心)部分来受益。
  • 如果你是cpu绑定的,那么也许吧。
  • @HughBothwell 每个节点都是独立的,但我无法从文件中途开始,因为我正在使用 pickle 将其加载到字典中。我可能会尝试拆分它。你能解释一下为什么我会把它分成 2 * 核心 (16) 块,而不是每个核心 (8) 块吗?
  • @ethg242:因为,在给定的核心上,如果一个线程被延迟,另一个线程可能能够利用空闲周期。不能保证,只有分析会告诉你什么是最好的,但这通常是有意义的最大进程数(取决于你的瓶颈所在)。
  • 至少您应该有一个(或多个基于其他 cmets)线程来读取数据,而另一个线程处理您的数据。每次您调用 read() (或您用来读取的任何方法)时,系统都会在后台稍微休眠(等待磁盘),并且您要确保使用该时间来做有用的工作(前提是有有用的工作要做)。

标签: python multithreading python-2.7 multiprocessing data-processing


【解决方案1】:

您需要的是producer-consumer technique。这个网站上有很好的解释:Python producer/consumer with exception handling

第二个示例使用库来实现它 (http://pypi.python.org/pypi/proconex/) 但不要!这是一项非常基本的技术,您可以手动完成并根据需要进行调整。

在您的情况下,读者将是生产者,处理将在多个消费者中完成。

如果最后需要合并数据,写入另一个队列,让另一个线程写入/处理。

profile your code很重要。

【讨论】:

  • 另一个可能对你有用的例子:code.activestate.com/recipes/…
  • 这会不会是(伪代码)for entry in file: new ProcessingThread(entry)
  • 不,更像是:q = Queue();生产者(write_to=q); Consumer1(read_from=q); Consumer2(read_from=q);请参阅链接的维基百科文章。它有代码示例。
  • 我明白了,这很有趣。这不是我想要的,但我会将其标记为已接受。谢谢!
猜你喜欢
  • 2011-07-17
  • 2016-07-02
  • 2018-10-27
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多