Python中具有非常大项目的生产者-消费者

Python中具有非常大项目的生产者-消费者,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我在以下场景中工作(使用Python)。我有一个用随机算法优化的神经网络,它需要恒定的训练数据流。每个数据都很大(比如说50兆字节),我有很多数据。整个数据集太大,无法放入RAM中。我可以看到处理这些数据的三种可能方式 依次从硬盘加载每个数据,然后执行神经网络的代码。这是缓慢的,原因显而易见 使用多线程(线程库)。然后我可以让多个线程从硬盘加载数据,并将它们放入主进程正在读取的队列中。这是相当好的工作,虽然在我看来,吉尔()是放慢了我。显然,神经网络的梯度计算并不是与硬盘读取并行执行的 使用多处

我在以下场景中工作(使用Python)。我有一个用随机算法优化的神经网络,它需要恒定的训练数据流。每个数据都很大(比如说50兆字节),我有很多数据。整个数据集太大,无法放入RAM中。我可以看到处理这些数据的三种可能方式

  • 依次从硬盘加载每个数据,然后执行神经网络的代码。这是缓慢的,原因显而易见
  • 使用多线程(线程库)。然后我可以让多个线程从硬盘加载数据,并将它们放入主进程正在读取的队列中。这是相当好的工作,虽然在我看来,吉尔()是放慢了我。显然,神经网络的梯度计算并不是与硬盘读取并行执行的
  • 使用多处理(多处理库)。这类似于2。尽管我当时需要使用的队列的实现是使用Linux管道,但这些管道被限制在非常小的范围内,因此主进程将大部分时间花在从队列中读取数据上

  • 以上所有这些方式我都不能接受。您能想出一种更有效的方法在Python中实现这种生产者-消费者问题吗?

    欢迎使用stackoverflow。问一个清楚的问题会让你更容易得到帮助。包括你到现在为止所做的工作,如果有错误,分享错误是非常重要的。请阅读这篇文章,以确保您得到一个好的答案,将数据分成不同的文件,例如5-10个块,然后使用多处理,只给子进程提供文件名,以便他打开文件并同时读取。。。这将IPC开销降至最低,同时最大限度地提高并发性。@Bakuriu这或多或少是我目前正在做的事情,在第三点中进行了解释。这个解决方案的问题是(我认为)Linux管道不是为在进程之间传输大量数据而设计的,我相信这就是
    多处理.Queue
    的实现方式,这使得获取子进程读取的内容非常慢。@Deeplearningmaniac我认为您不理解我所说的:进程之间交换的唯一数据是文件名。您告诉子进程要读取的文件的名称,它们读取该文件并处理数据,将其保存在另一个临时文件中,然后主进程读取结果失败并执行其操作。实际处理只能在主进程中进行。我只需要从硬盘读取数据就可以并发。我试图解释的问题是,将数据从子进程移动到父进程非常缓慢。