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

时间:2018-03-19 03:15:57

标签: python multithreading asynchronous multiprocessing nonblocking

对于磁盘上的IO读/写文件,默认情况下它几乎是阻塞操作。我一直在研究一个使用这种操作的项目(从磁盘读/写)并使用默认的numpy阻塞IO here。这是一个很好的选择,直到我发现我正在处理非常大的数据集!!

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

  1. 非阻塞方法
  2. 多线程方法
  3. 多处理方法
  4. 我想知道哪种方法适合减少IO时间,因为我知道我的IO操作总是在磁盘(本地磁盘)上执行。我遇到了大量的图书馆,例如twistedasyncioaiofilesmultiprocessingmultithreading。因为我之前从未使用过IO异步或事件驱动的网络,所以我不确定从上面的三种方法中选择什么!

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

    修改

    特别感谢java.lang.NoSuchMethodError: scala.reflect.internal.Definitions$definitions$.classExistentialType(Lscala/reflect/internal/Types$Type;Lscala/reflect/internal/Symbols$Symbol;)Lscala/reflect/internal/Types$Type; at scala.tools.nsc.symtab.classfile.ClassfileParser.processClassType$1(ClassfileParser.scala:670) at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2type$1(ClassfileParser.scala:679) at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2type$1(ClassfileParser.scala:709) 提出以下几点:

    • 您的程序在开始之前是否需要加载所有数据? 是的,但有时程序只需要从文件中加载一部分数据。
    • 在完成所有工作之前,它是否可以开始将一些数据写入磁盘? 是的,这实际上就是我在寻找的东西。
    • "是否正常工作"功能有没有发布GIL? 我没有得到这个问题,但我的程序通过库mpi4py使用多处理器。但是,IO操作始终由单个处理器完成。

1 个答案:

答案 0 :(得分:0)

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

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