从磁盘读取还是分配系统内存,哪个更快?

6
我的环境是XP 32位。我发现当分配的内存接近最大大小2GB时,也就是说虚拟空间很少可用,分配新的内存非常缓慢。
因此,如果我有一个页面文件,我的应用程序需要对它们进行分析。我有两种方法。一种是将它们全部读入系统内存,然后进行分析。另一种是首先保留一个内存缓冲区作为缓存,将页面文件的一部分读入该缓冲区,进行分析,然后丢弃它,再读取页面文件的第二部分,并覆盖缓存,再次进行分析。
从分析结果来看,第二种方法更快,因为它避免了分配时间成本。
你觉得呢?提前感谢。
5个回答

5
你忘记了第三种方式 - 将内存映射到文件中,参见函数CreateFileMapping/MapViewOfFile。这是最快的方法。

这是相反的情况。文件被映射到进程地址空间中。 - Void

5

(1) 我不确定问题是否与标题相符。如果您在32位Windows上分配了接近2GB的RAM,系统可能会将大量内存分页到磁盘,这是我首先要查找的缓慢原因。当您使用大量内存时,应将其视为存储在磁盘(pagefile.sys)中但在物理RAM中缓存。第二个选项可能更快,不是因为分配成本,而是因为一次性使用大量内存的成本。实际上,当您将文件复制到一个大的分配中时,您正在通过RAM将其中大部分内容从磁盘复制到磁盘,然后当您再次运行分析时,您又将副本加载回RAM中。如果您的分析是单遍算法,则存在许多冗余工作。

(2) 我认为,对文件进行mmap(在Windows上使用MapViewOfFile和相关函数)。

编辑:(3)警告。如果该文件目前为1.8GB,则有可能明年它可能会变成4GB。如果是这样,我会现在计划使其大小大于32位机器上的2 ^ 32,这意味着采取您的第二个选项,或者仍然使用MapViewOfFile,但一次处理文件的一个合理大小的块,而不是一次全部处理。否则,当有人尝试在大文件上运行代码并报告错误时,您将重新访问此代码。


缓冲区分配可能会在内存耗尽之前失败。问题是你是否在运行64位Windows。这允许您使用每个进程>2GB的_RAM。 - MSalters
1
@MSalters: 提问者没有运行64位的Windows。 @Buzz: 你会认为在所有RAM都被使用之前,Windows不会交换(对于非空闲程序),但它似乎从来就不是这样工作的。在您的情况下可能不存在交换,但如果我试图充分解释您两个选项之间的性能差异,我想要排除它-最简单的检查是确保页面文件使用在程序运行时不增加。其次是查看CPU缓存未命中情况。但正如我所说的,我会映射该文件,如果这是最快的,谁关心其他的呢?;-) - Steve Jessop
1
哦,我还模糊地记得32位Windows在使用超过2GB的RAM方面并不特别好 - 它可以使用它,但是有一个分裂,即它可以用于应用程序和仅内核可以使用的部分。不过也许这只是虚拟空间,我不太记得了。例如,如果您有两个运行每个使用1.5GB内存的应用程序,在4GB RAM的情况下,Win32实际上可以避免交换吗?你会认为是这样的,但我不完全确定。 - Steve Jessop
并不完全准确 - 当您分配内存时,Windows 只会承诺内存,直到您通过读取或写入页面时,它才会实际分配任何内容。 - Ana Betts
Win32通常有两个内存限制:一个是每个进程的2 GB虚拟地址空间,另一个是4GB物理地址空间。后者的问题在于物理地址空间还包括为PCIe卡保留的内存,特别是显卡。512 MB显卡可能会遮盖4GB RAM的1/8。 - MSalters
显示剩余3条评论

1
你最好使用Windows的MapViewOfFile和类似的函数(相当于mmap的Windows版本)。这将允许操作系统管理文件各个部分的页面调入。

但是如果我有多个大的页面文件(1.8GB),这样可以吗? - Buzz
操作系统将整个文件映射到您的进程内存中,但只会将您正在查看的文件位加载到RAM中。这正是操作系统管理其磁盘交换空间的方式。 - doron
2
@Buzz:你不能同时将多个1.8GB文件的整个映射到同一个32位进程中,因为虚拟空间必须被分配,即使物理内存只有在需要时才会被提交。据我所知,在不同的进程中使用不同的文件应该是可以的,而且你总是可以将文件映射成块(就像你的第二个选项读取块一样,但映射更大的块)。 - Steve Jessop

0

为什么分配的内存量如此之高?如果内存分配需要合理的时间,那么在内存中进行操作会更快 - 我的方法是在内存中进行操作,并尝试找到一种减少内存使用量的方法,使其再次变得快速。


0
在我看来,你可以自己管理分页,也可以让操作系统为你管理分页。在大多数情况下,我建议让操作系统处理分页(使用虚拟内存)。由于我不信任微软操作系统,所以不能推荐这种技术,但你的情况可能会有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接