1

我必须处理通常不适合主内存的大量数据。我访问这些数据的方式具有很高的局部性,因此将部分数据缓存在内存中看起来是一个不错的选择。仅 malloc() 一个巨大的数组是否可行,并让操作系统找出要分页的位以及要保留的位?

4

2 回答 2

6

假设数据来自一个文件,你最好内存映射该文件。否则,你最终要做的是分配你的数组,然后将数据从你的文件复制到数组中——由于你的数组被映射到页面文件,你基本上只是将原始文件复制到页面文件,并且在污染“缓存”(即物理内存)的过程中,因此当前处于活动状态的其他数据更有可能被驱逐。然后,完成后(通常)将数据从数组写回原始文件,这(在这种情况下)意味着从页面文件复制回原始文件。

相反,内存映射文件只是创建一些地址空间并将其直接映射到原始文件。这避免了将数据从原始文件复制到页面文件(完成后再次复制)以及在从原始文件到页面文件的过程中临时将数据移动到物理内存中。当然,最大的胜利是当/如果有大量原始文件您根本没有真正使用过(在这种情况下,它们可能根本不会被读入物理内存,假设未使用的块至少是一个页面在尺寸方面)。

于 2010-09-20T23:17:16.870 回答
0

如果数据在一个大文件中,请考虑使用 mmap 来读取它。现代计算机有如此多的 RAM,您可能没有足够的可用交换空间。

于 2010-09-20T23:04:59.110 回答