多进程并行(这里仅讨论单文件式数据文件)

目前已知信息:多进程情况时,getitem、collate 均在每个子进程的包裹下,均可实现并行

现有思路、方法(针对 CVS 等数据文件,非图像文件):

A:数据读取后放在内存,getitem 内放置数据预处理、collate 内放置数据预处理

理论上数据若能够被放入内存,那么这是最高效的方案

B:数据在 getitem 中按需读取,getitem 内放置数据预处理、collate 内放置数据预处理

理论上会产生大量 I/O 开销,即使能靠多进程并行读取加速,也无法贴近内存读取速度

C:数据按需预调用维护 chunk 放在内存,getitem 内放置数据预处理、collate 内放置数据预处理

理论上是最为高效的方案,能够在内存有限的情况下达到内存读取的效果,但实现略复杂

补注:

A 方案的缺陷在于需要占据大量内存,且一开始的读取也需要占用时间

B 方案缺陷在于会造成大量 I/O 开销

C 方案的实现上面较为复杂,首先需要实现 chunk 思路,然后还需要实现异步读取思路

目前有待进一步实验的内容:

1.内存读取的初始读取速率、I/O 速率,以及是否需要/可依靠多进程读取加速,读取速率影响因素

2.内存读取、按需读取的总时间开销研究(不同设备、数据集大小、不同进程模式)及影响因素研究

3.内存读取、按需读取的内存开销研究(不同设备、数据集大小)及影响因素研究

4.按需读取的加速效果(主要研究加速在 I/O 还是数据预处理)及影响因素研究

5.I/O 开销的研究(读取时间、调用时间),以明确 I/O 开销的核心

从历史实验经验基本可以判断调用时间才是开销的核心,因为 SSD 带宽很少跑满

6.getitem、collate 内放置数据预处理策略的方案(不同设备、数据集大小、预处理策略等)

主要明确何时应当放在 getitem,何时放在 collate

7.chunk 的具体实现及速率研究(理论上速率应超过或者同内存读取持平)