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

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

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

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

你怎么看? 非常感谢。

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

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

编辑:(3)小心。 如果该文件目前为1.8GB,则明年可能有4GB的可能性。 如果是这样的话,我现在计划在32位机器上有一个大于2 ^ 32的大小,这意味着要么采取第二个选项,要么仍然使用MapViewOfFile,而是在一个合适的大小的文件时间,而不是一次。 否则,当第一次有人在一个大文件上尝试这个代码并报告错误时,你会重新访问这个代码。

你忘记了3d的方式 – 将内存映射到文件,请参阅函数CreateFileMapping / MapViewOfFile这是最快的方法

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

为什么分配的内存量如此之高? 如果内存分配需要一段合理的时间,那么你会发现在内存中执行内存要快得多 – 我的方法是在内存中执行它,并试图找到一种方法来减少内存使用量,以使其快速。

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