我假设您的问题来自观察到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中”)。
mmap
主代码之前先进行测量和测试即可。许多现代操作系统在常规代码之间提供相似的性能read
,且复杂度较低。(此外,是的,Python中的mmap提供了Windows和UNIX内存映射的可移植接口)。