哪一个更快,从磁盘读取或分配系统内存

时间:2010-02-03 13:18:26

标签: c++ windows visual-c++

我的环境是XP 32位。我发现当分配的内存几乎是最大大小2GB时,这意味着有一点虚拟空间可用,分配新内存非常慢。

因此,如果我有一个页面文件,我的应用程序需要分析它们。 我有两种方法。一种是将它们全部读入系统内存,然后进行分析。 另一种是首先将内存缓冲区作为缓存存储,并将页面文件的一部分读入该缓冲区,进行分析然后丢弃,然后读取页面文件的第二部分,并覆盖缓存,再次进行分析。

从分析中看,第二个更快,因为它避免了分配时间成本。

你怎么看?谢谢你。

5 个答案:

答案 0 :(得分:5)

你忘了3d方式 - 将内存映射到文件,参见函数CreateFileMapping / MapViewOfFile 这是最快捷的方式

答案 1 :(得分:5)

(1)我不确定问题是否与标题相符。如果你在32位Windows上分配接近2GB的RAM,系统可能会将大量内存分页到磁盘,而这就是我首先考虑减速的地方。当您使用大量内存时,您应该将其视为存储在磁盘上(在pagefile.sys中),但缓存在物理RAM中。第二个可能更快,不是因为分配的成本,而是因为一次使用大量内存的成本。实际上,当您将文件复制到一个大的分配中时,您通过RAM将大部分磁盘复制到磁盘上,然后当您再次运行它进行分析时,您将再次将该副本加载回RAM。如果您的分析是单程算法,则需要进行大量冗余工作。

(2)我认为,mmap文件(MapViewOfFile和Windows上的朋友)。

编辑:(3)谨慎。如果该文件目前是1.8GB,那么明年可能会有4GB。如果是这样,我现在计划在32位机器上使用大于2 ^ 32的大小,这意味着要么采用第二个选项,要么仍然使用MapViewOfFile,但是在一个文件中执行一个合理大小的文件块。时间,而不是一下子。否则,当有人在大文件上尝试并报告错误时,您将重新访问此代码。

答案 2 :(得分:1)

最好的办法是使用windows MapViewOfFile和类似的功能(Windows等效于mmap)。这将允许操作系统管理文件各部分的分页。

答案 3 :(得分:0)

为什么分配的内存量如此之高?如果内存分配需要一段合理的时间,那么你会发现在内存中进行操作要快得多 - 我的方法是在内存中进行操作,并尝试找到一种方法将内存使用量减少到快速的速度

答案 4 :(得分:0)

在我看到这种情况时,您要么自己管理分页,要么让操作系统为您管理分页。在大多数情况下,我建议让操作系统处理分页(使用虚拟内存)。 由于我对MS操作系统不信任,我不推荐这种技术,尽管你的里程可能会有所不同。