【问题标题】:Is there any benefit to using memory mapping for a sequentially accessed file?对顺序访问的文件使用内存映射有什么好处吗?
【发布时间】:2016-01-04 04:32:41
【问题描述】:

我有一个应用程序,我在其中纯粹以 Java 顺序处理文件。文件打开,直接读取一次,然后关闭。

目前我只使用文件通道。有一个内存映射文件的选项。这样做有什么好处吗?

【问题讨论】:

  • 可能没有。 MMapping 有助于随机访问。您是否尝试过并衡量了收益?
  • @zapl 我宁愿对这个特定问题有专家意见而不是经验测试,因为内存映射的操作系统交互很复杂,而且我不够专业,无法理解不同的后果。此外,不同的操作系统可能工作方式不同。基本上我希望有该领域的专家提供权威的答案。
  • stackoverflow.com/questions/45972/mmap-vs-reading-blocks 涵盖了一些更理论的方面。通道应该等于读取,因为您复制到用户空间。直接文件到文件复制可以利用 DMA 并避免使用空间
  • The javadoc 说:对于大多数操作系统来说,将文件映射到内存比通过通常的读写方法读取或写入几十千字节的数据更昂贵。从性能的角度来看,通常只值得将相对较大的文件映射到内存中。

标签: java file io


【解决方案1】:

这个问题与硬件层面有关。

按顺序处理文件没有任何好处。如果文件是通过映射处理的,那么与顺序处理相比,通过将内存分配给其他一些函数(变量等)会额外浪费内存。 内存管理的作用是由一个叫做的原理完成的,

局部性原则

程序倾向于重用彼此接近或最近使用过的数据和指令

  1. 时间局部性

    • 最近引用的项目可能在不久的将来会被引用
    • 一个块往往会被重复访问
  2. 空间局部性

    • 地址附近的项目往往会在时间上紧挨着引用
    • 附近的块往往会被访问

让我举个例子,

sum = 0;
int array[] = new int[10];
for (int i = 0; i < array.length; i++){
  sum += array[i];
}

数据

  • 按顺序访问数组元素 - 空间局部性
  • 每次迭代的参考和 - 时间局部性

说明

  • 顺序引用指令 - 空间局部性
  • 反复循环循环 - 时间局部性

回到问题,由于文件中的数据以有序的方式写入内存(如数组),因此映射没有优势,因为这是以我之前描述的空间局部性方式进行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2019-01-18
    相关资源
    最近更新 更多