选择正确的方法来减少 IO 操作



当涉及到从磁盘读取/写入文件的IO时,默认情况下它几乎是阻塞操作。我一直在研究一个使用此类操作(从磁盘读取/写入)的项目,并在此处使用默认的阻塞 IOnumpy。这是一个很好的选择,直到我发现我正在处理非常大的数据集!!

我一直在努力改善项目的执行时间。做完基准测试后,我发现IO操作是瓶颈。因此,我现在应该考虑numpy默认阻塞IO之外的其他事情。阅读几天后,我发现我有三种方法可供选择,可以减少 IO 时间:

  1. 非阻塞方法
  2. 多线程方法
  3. 多处理方法

我想知道这些方法中的哪一种适合减少 IO 时间,因为我知道我的 IO 操作始终在磁盘(本地磁盘)上执行。我遇到的很多库,例如扭曲,异步,aiofiles,多处理和多线程。因为我以前从未使用过IO异步或事件驱动的网络,所以我不确定从上面的三种方法中选择什么!!

你们的建议和想法对我来说很有价值。提前谢谢你

编辑:

特别感谢带来以下几点的mobiusklein

  • 您的程序是否需要加载所有数据才能启动?是的,但有时程序只需要从文件中加载一部分数据。
  • 它能否在所有工作完成之前开始将一些数据写入磁盘?是的,这实际上是我正在寻找的。
  • "工作"功能会释放 GIL 吗?我不明白这个问题,但我的程序通过库 mpi4py 使用多处理器。但是,IO 操作始终由单个处理器完成。

如果开始写入输出所需的所有信息都位于 MPI 层次结构的一个节点中,并且您希望该节点仍然能够为其他计算做出贡献,并且您的其他计算调用释放 GIL 的 C 函数,则可以在每个节点上启动一个线程以在工作节点内执行 I/O 操作。这避免了将数据传输到专用写入器的开销,代价是增加了每个节点工作负载的不可预测性。

如果需要在开始写入之前聚合多个工作线程的结果,则可以在 MPI 层次结构中创建一个专用的编写器节点,并将所有数据专门汇集到该节点,并使该节点负责确定何时准备好写出数据。这可以通过一个线程来接收消息和一个线程来完成实际写入。如果编写器不是主编写器,则使用普通 MPI 可能无法做到这一点,在这种情况下,您可能需要混合另一种风格的 IPC,例如multiprocessing

相关内容

  • 没有找到相关文章

最新更新