具有大数据集的计算问题的I / O策略?


15

我的研究小组专注于分子动力学,分子动力学显然可以生成千兆字节的数据作为单个轨迹的一部分,然后必须对其进行分析。

我们关注的几个问题涉及数据集中的相关性,这意味着我们需要跟踪内存中的大量数据并对其进行分析,而不是使用更多的顺序方法。

我想知道的是将大型数据集的I / O处理为脚本的最有效策略是什么。我们通常使用基于Python的脚本,因为它使对文件I / O的编码比使用C或Fortran的痛苦少得多,但是当我们有成千上万的行需要处理时,尚不清楚最好的方法是什么。我们应该考虑使用C语言编写文件输入部分,还是另一种策略更有用?(简单地将整个数组预加载到内存中会比一系列顺序读取“块”(兆字节)更好吗?

一些附加说明:

  • 因此,我们主要是在寻找用于后处理的脚本工具,而不是“在线”工具-因此要使用Python。

  • d=1个6ΔŤXŤ+ΔŤ-XŤ2

Answers:


6

我假设您的问题来自观察到I / O会在整个分析中造成大量开销。在这种情况下,您可以尝试将I / O与计算重叠。

成功的方法取决于您如何访问数据以及对该数据执行的计算。如果您可以识别模式,或者预先知道对数据的不同区域的访问,则可以在处理“当前块”时尝试在后台预取数据的“下一个块”。

举一个简单的例子,如果只遍历文件一次并处理每一行或每一组行,则可以将流分成几行(或MB)。然后,在块的每次迭代中,您可以在处理块i的同时加载块i + 1。

您的情况可能更复杂,需要更多涉及的解决方案。无论如何,其想法是在处理器有一些数据需要处理时在后台执行I / O。如果您提供有关您的特定问题的更多详细信息,我们也许可以对其进行更深入的研究;)

---- 详细介绍后的扩展版本 ----

我不确定我是否理解该表示法,但是,正如您所说,这个想法是一个全方位的互动。您还提到数据可能适合RAM。然后,我将从测量加载所有数据的时间和执行计算的时间开始。现在,

  • 如果I / O的百分比较低(较低,因为您根本不在乎开销,无论它是什么:0.5%,2%,5%,...),那么只需使用简单的方法:加载数据立即进行计算。您将节省时间以进行更有趣的研究。

  • 如果您负担不起开销,则可能需要研究Pedro的建议。请记住Aron Ahmadia提到的内容,并在进行全面实施之前对其进行测试。

  • 如果先前的方法不令人满意,我将寻求一些核心以外的实现方法[1]。由于似乎您正在对数据执行计算,因此希望:)一些伪代码(假设分析结果适合RAM):ñ2ñ

    加载chunk1和chunk2
    对于块i = 1到n
        异步加载块i + 1
        对于j = i + 1到n中的块
            异步加载块j + 1
            使用块i,j(*为第一次迭代,这是预加载的块1和2 *)进行计算

注意:这是一种快速且肮脏的伪代码,需要调整索引。

为了实现这一点,通常使用所谓的双缓冲。粗略地说:将内存划分为两个工作区;当数据在后台加载到工作区1中时,处理器将使用工作区2中的数据进行计算。在每次迭代时,交换角色。

抱歉,我现在无法提供良好的参考。

[1]核外算法结合了某种机制来(有效)处理磁盘上的数据。它们被称为内核外(而非内核内)(“ RAM中”)。


7

我以前不得不处理类似的问题,而我最喜欢的解决方案是使用内存映射的I / O,尽管在C中...

它背后的原理非常简单:您无需打开文件并从文件中读取文件,而是将其直接加载到内存中并像访问大型数组一样对其进行访问。提高效率的诀窍是,操作系统实际上并不加载文件,它只是将其视为需要加载的换出内存。当您访问文件中的任何给定字节时,文件那部分的内存页面将被交换到内存中。如果您继续访问文件的不同部分,并且内存紧张,那么用不到的部分将被自动换回!

快速的Google搜索告诉我,Python 16.7也可用mmap —内存映射文件支持,但是我对Python的了解还不足以告诉它是否真的是同一回事。


1
只需在执行类似mmap主代码之前先进行测量和测试即可。许多现代操作系统在常规代码之间提供相似的性能read,且复杂度较低。(此外,是的,Python中的mmap提供了Windows和UNIX内存映射的可移植接口)。
阿隆·艾玛迪亚

1

也许您可以在文件I / O部分中使用Cython并将这一部分转换为C代码?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.