代码之家  ›  专栏  ›  技术社区  ›  Dirk Groeneveld

使用页面文件进行缓存?

  •  1
  • Dirk Groeneveld  · 技术社区  · 14 年前

    我必须处理大量通常不适合主内存的数据。我访问此数据的方式具有较高的位置性,因此在内存中缓存部分数据似乎是一个不错的选择。是否可以只使用malloc()一个巨大的数组,让操作系统找出要分页的位和要保留的位?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Jerry Coffin    14 年前

    假设数据来自一个文件,那么最好对该文件进行内存外映射。否则,您最终要做的就是分配数组,然后将数据从文件复制到数组中——由于数组被映射到页面文件,所以您基本上只是将原始文件复制到页面文件,并且在这个过程中会污染“缓存”(即物理内存),所以其他当前处于活动状态的数据有很多是被驱逐的机会。然后,完成后,您(通常)将数据从数组写回原始文件,这(在本例中)意味着从页面文件复制回原始文件。

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

        2
  •  0
  •   twk Mark Adler    14 年前

    如果数据在一个大文件中,请使用mmap进行读取。现代计算机内存太多,可能没有足够的交换空间。