【问题标题】:How to divy up a large file amongst python threads如何在 python 线程中分割一个大文件
【发布时间】:2016-01-30 23:34:37
【问题描述】:

我有一个非常大的文件,~1Gig,我想运行并行读取部分文件的线程。

NUM_THREADS = 50
FILE_NAME = "some/file"

def read_chunk(offset, lines_to_read):
  # Read 'lines_to_read' number of lines from FILE_NAME, starting at 'offset'

def divide_work():
  num_lines = sum(1 for line in open(FILE_NAME))
  lines_per_thread = math.ceil(num_lines/NUM_THREADS))

  for i in range (0, NUM_THREADS):
    offset = i * lines_per_thread
    thread = Thread(target = read_chunk, args = (offset, lines_per_thread,)) 
    thread.start()
    thread.join()

假设文件中的行数将平均分为线程数。如何从某个行偏移中读取一定数量的行?我知道'seek',但它使用字节,我需要使用行。

【问题讨论】:

  • 到单个驱动器的 IO 通常不能并行化。查找消费者生产者模式。
  • 如果人们对您的问题投了反对票,但没有提供他们为什么这样做的反馈,那就太好了。

标签: python multithreading io


【解决方案1】:

如果可以将进程拆分为不依赖于公共资源(例如磁盘 I/O)的任务,线程化只会为您带来性能提升。

在您的场景中,您的瓶颈正在从磁盘读取文件,该文件受限于磁盘提供的 I/O 速度。如果您创建一个线程来处理从磁盘读取的信息,您可能会看到性能提升。例如 2 个线程。第一个线程是管理磁盘 I/O 并将数据转储到内存队列。第二个线程使用 CPU 资源处理内存队列中的数据(执行哈希、数据比较等...)

如果您在开始处理文件之前需要文件的全部内容,我认为除了升级驱动器或使用 RAM 磁盘之外,您无能为力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多