为顺序访问的文件使用内存映射有什么好处吗?

Tyl*_*den 5 java io file

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

目前我只使用文件频道.存储器映射文件有一个选项.这样做有什么好处吗?

Lah*_*ake 1

这个问题跟硬件水平有关系。

\n\n

如果按顺序处理文件则没有任何优势。如果通过映射处理文件,则与顺序处理相比,将内存分配给其他一些函数(变量等)会产生额外的内存浪费。\n内存管理的作用是通过称为以下原则来完成的:

\n\n

局部性原理

\n\n
\n

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

\n
\n\n
    \n
  1. 时间局部性

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

    \n\n
      \n
    • 地址附近的项目往往会在时间上接近地被引用
    • \n
    • 附近的街区往往会被访问
    • \n
  4. \n
\n\n

让我举一个例子,

\n\n
sum = 0;\nint array[] = new int[10];\nfor (int i = 0; i < array.length; i++){\n  sum += array[i];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

数据

\n\n
    \n
  • 访问顺序 \xe2\x80\x93 中的数组元素 空间局部性
  • \n
  • 每次迭代的参考和 \xe2\x80\x93 时间局部性
  • \n
\n\n

指示

\n\n
    \n
  • 依次引用指令 \xe2\x80\x93 空间局部性
  • \n
  • 反复循环 \xe2\x80\x93 时间局部性
  • \n
\n\n

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

\n