为什么从内存映射文件读取如此之快?

数码眼

我对内存映射的I / O经验不足,但是第一次使用它们后,我惊讶于它们的速度。在性能测试中,我发现从内存映射文件读取比通过常规c ++ stdio读取快30倍。

我的测试数据是一个3GB的二进制文件,它包含20个大型双精度浮点数组。测试程序的结构方式称为外部模块的读取方法,该方法使用在后台进行I / O映射的内存。每当我调用read方法时,此外部模块都会返回一个指针和该指针指向的数据大小。从此方法返回后,我调用memcpy将返回的缓冲区的内容复制到另一个数组中。由于我正在执行memcpy来从内存映射文件中复制数据,因此我期望内存映射读取的速度不会比普通stdio快得多,但我感到惊讶的是它快了30倍。

为什么从内存映射文件读取如此之快?

PS:我使用Windows机器。我以I / O速度为基准,计算机的最大磁盘传输速率约为90 MiB / s

Codenheim

IO的OS内核例程(例如读或写调用)仍然只是函数。编写这些功能是为了将数据复制到用户空间缓冲区,或从用户空间缓冲区复制到内核空间结构,然后复制到设备。当您认为有一个用户缓冲区,一个IO库缓冲区(例如stdio buf),一个内核缓冲区,然后是一个文件时,数据可能要经过3个副本才能在程序和磁盘之间移动。IO例程也必须健壮,最后,sys调用自身会施加延迟(捕获到内核,上下文切换,再次唤醒进程)。

内存映射文件时,您将跳过其中的大部分,从而消除了缓冲区副本。通过像对待大型虚拟阵列一样有效地处理文件,可以在不经历系统调用开销的情况下启用随机访问,从而降低了每个IO的延迟,并且如果原始代码效率低下(许多小的随机IO调用),那么开销将减少,甚至更彻底地

虚拟内存,多处理OS的抽象是有代价的,仅此而已。

但是,在某些情况下,您可以通过禁用缓冲来改善IO,这些情况在您知道会损害性能的情况下(例如,大量连续写入),但是除此之外,在不完全消除操作系统的情况下,您确实无法提高内存映射IO的性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Spark从S3读取和写入如此之快

为什么C ++模板计算如此之快?

为什么MATLAB在矩阵乘法中如此之快?

为什么这个C ++程序如此之快?

为什么列表乘法如此之快?

当今计算机如此之快,为什么查看PDF文件仍然很慢?

为什么只有1个预配置读取容量单位的DynamoDB扫描速度如此之快?

为什么Dask的执行速度如此之慢,而多处理的执行速度却如此之快?

为什么三元运算符如此之快?

为什么在Python 3中“范围(10000000000000001)”如此之快?

为什么 Pandas 的速度如此之快?如何定义这样的函数?

为什么随后用youtube-dl下载的速度如此之快?

为什么USB串行在Linux中如此之快?

为什么在Python 3中复数求幂如此之快?

为什么此代码在进行优化编译时运行得如此之快?

是什么使Python的列表附加方法如此之快?

是什么使Java编译器如此之快?

与较新的libstdc ++。so链接时,为什么C ++可执行文件的运行速度如此之快?

为什么在摩托罗拉68k中dbra对于这么大的循环计数如此之快?

为什么查询在Entity Framework中花费这么长时间,而在SQL中却如此之快呢?

Python Pandas MySQL - 为什么在将数据帧写入数据库时 SQLite 速度如此之快

为什么默认的最大堆大小如此之小

Chrome分配配置文件:为什么handleEvent的内存消耗如此之大?

是什么让gcc std :: list排序实现如此之快?

为什么使用JavaScript对32位数字进行排序比对33位数字进行排序如此之快?

当测试值与预测值之间的差异如此之近时,为什么我的MSE如此之高?

Android Studio,工具提示消失得如此之快

WebStorm调试javascript停止并断开的速度如此之快

命令末尾的“&”如何使脚本如此之快?