问题:mmap技术已经可以实现两个进程之间的零拷贝通信了,为什么还要再引入arrow?
mmap打通了两个进程之间的快速通信通道,但若仅依赖于mmap技术,依然存在很严重的性能问题。
举个例子,在Linux系统内存中(/dev/shm/),分别创建一个json文件和arrow文件,这两个文件的数据一样,都是100w行数据,如下所示。
1 | import json |
在文件创建完成之后,我们分别直接通过mmap映射方式去读取json文件和读取arrow文件,看看加载效率。
- 将
json文件通过mmap映射后,再通过json.loads加载解析,我们查看其耗时情况: - 将
arrow文件通过pa.memory_map映射后,再通过ipc.open_file().read_all()加载解析,我们查看其耗时情况:
1 | import time |
结果显示:
1 | 方案一 [JSON 解析] 耗时: 1.1515 秒 |
| 文件 | 数据量 | 加载耗时(秒) | 提升效率 |
|---|---|---|---|
| JSON | 100w行 | 1.1515 | 0 |
| Arrow | 100w行 | 0.0114 | 101倍 |
总结:
上面的例子说明,仅仅依靠mmap技术,进程可以快速获取到想要的数据;
但是问题是,获取到数据一般不是我们的最终目的,我们的目的一般是要理解这段数据并进行相关处理操作;因此在获取到数据之后,我们还需要对这段数据进行序列化成内存对象,以方便程序进行处理;
因此就有了如下区别:
- mmap技术方便程序快速获取到json数据字节,接下来就需要程序自身将其转换成json对象,该阶段需要扫描字符、类型转换、编解码操作,这是一个CPU密集型操作,数据量越大就约耗时
- 同样地,mmap技术方便程序快速获取到arrow数据,在加上arrow自身功能加持,程序读取到的arrow数据与在内存对象数据是一致的,无须进行解析操作,省去了CPU密集型的操作,因此加载数据时耗时几乎和数据量无关,因此数据量越大越能体现arrow的优势