我有一个
涉及的代码正在从大型磁盘文件加载值,并将它们放入Bloom过滤器中,该过滤器使用我的
起初,我认为这可能是因为mmap文件的后备存储与我要加载的文件在同一磁盘上,但似乎并不是这个问题。我将两个文件放在两个物理不同的磁盘上,性能没有改变。(虽然我相信它们在同一个控制器上。)
然后,我使用来尝试将所有内容都强制存入RAM,但mmap实现仍然非常慢。
因此,目前我只是直接分配内存。这次比较中我所做的唯一更改就是标志
请注意,为了测量性能,我既在查看
有人能解释这种巨大的性能差异吗?
谢谢!
BitVector
类,可以使用new
动态分配内存,也可以映射文件。对于小文件,使用它没有明显的性能差异,但是在使用16GB文件时,发现mmap文件比使用new
分配的内存慢得多(大约慢了10倍或更多)。请注意,我的机器有64GB的RAM。涉及的代码正在从大型磁盘文件加载值,并将它们放入Bloom过滤器中,该过滤器使用我的
BitVector
类进行存储。起初,我认为这可能是因为mmap文件的后备存储与我要加载的文件在同一磁盘上,但似乎并不是这个问题。我将两个文件放在两个物理不同的磁盘上,性能没有改变。(虽然我相信它们在同一个控制器上。)
然后,我使用来尝试将所有内容都强制存入RAM,但mmap实现仍然非常慢。
因此,目前我只是直接分配内存。这次比较中我所做的唯一更改就是标志
BitVector
构造函数。请注意,为了测量性能,我既在查看
top
命令,也在观察每秒可以向Bloom过滤器中添加多少个状态。当使用时,CPU使用率甚至不在top
命令中注册,尽管开始移动(我正在运行Ubuntu服务器),这看起来是处理驱动程序的日志记录的进程。输入和输出文件存储在两个HDD上。有人能解释这种巨大的性能差异吗?
谢谢!
operator new
使用malloc
,而malloc
对于大请求使用mmap
!当您说“使用一个16GB文件”时,这表明您正在使用一个 真实 的文件,而不是来自/dev/shm
的文件?如果是这种情况,尤其是因为您注意到日志记录过程正在增加,减速可能是由于磁盘访问造成的预读和错误故障(虽然我不知道空零页面应该在磁盘上执行什么操作)。 - Damon/dev/shm
并不是真正的临时文件,而是一种向操作系统请求“给我虚拟内存”的方式,因此如果您想要分配内存(而不是读取实际文件),那么这更接近您想要的内容。页面错误应该复制零页,并且不需要锁定。 - Damon