微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存映射文件的性能特点

背景:

我有一个Java应用程序在相当大的内存映射文件(> 500 MB)上执行密集IO。 程序读取数据,写入数据,有时也是这样。

所有读/写function具有相似的计算复杂度。

我对程序的IO层进行了基准testing,发现了内存映射文件的奇怪性能特征:

用内存映射文件实现虚拟内存

为什么这个循环会毁掉我的记忆?

跨进程内存障碍

将csv列加载到numpy memmap(快速

msync()写入文件只改变了页面或整个caching的缓冲区?

它每秒执行90k次读取(每次读取1KB随机位置)

它每秒执行38k次写入(按顺序每次迭代写入1KB)

它每秒执行43k次写入(每次迭代在随机位置写入4个字节)

它每秒只执行9k次读/写组合操作(读取12个字节,然后每次迭代写1KB,随机位置)

在64位JDK 1.7,Linux 3.4上的程序。

该机器是一个普通的Intel PC,具有8个线程的cpu和4GB的物理内存。 进行基准testing时,只有1 GB分配给JVM堆。

如果需要更多的细节,这里是基准代码: https : //github.com/HouzuoGuo/Aurinko2/blob/master/src/test/scala/storage/Benchmark.scala

这里是执行上面的读,写,读/写function: https : //github.com/HouzuoGuo/Aurinko2/blob/master/src/main/scala/aurinko2/storage/Collection.scala

所以我的问题是:

鉴于固定的文件大小和内存大小,影响内存映射文件随机读取性能的因素是什么?

鉴于固定的文件大小和内存大小,影响内存映射文件随机写入性能的因素有哪些?

我如何解释读/写联合操作的基准结果? (我期待它每秒执行超过20K的迭代)。

谢谢。

使用mmap进行Emacs缓冲区分配

在64位(或32位)Windows上以32位进程访问> 2,3,4GB文件

Windows内存映射文件内容认情况下始终归零?

什么是内存映射文件和实际的内存使用情况?

如何找出一个(Windows)的内存映射文件已经存在,使用Python

内存映射文件性能取决于磁盘性能文件系统类型,可用于文件系统缓存的空闲内存和读/写块大小。 Linux上的页面大小是4K。 所以你应该期待4k读/写的最高性能随机位置的访问会导致页面错误,如果页面没有被映射,并将拉一个新的页面读取。 通常,如果要将文件视为一个内存数组(或Java中的ByteBuffer),则需要内存映射文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐