代码之家  ›  专栏  ›  技术社区  ›  janetsmith

是否需要使用mappedbytebuffer.force()将数据刷新到磁盘?

  •  10
  • janetsmith  · 技术社区  · 14 年前

    我正在使用mappedbytebuffer加速文件读/写操作()。我的问题如下:

    1. 我不确定是否需要使用.force()方法将内容刷新到磁盘。似乎没有.force(),.getint()仍然可以很好地工作(因为这是一个内存映射缓冲区,所以我假设.getint()从磁盘获取数据,这意味着数据已经刷新到磁盘中了。

    2. .force()方法是阻塞方法吗?

    3. 阻塞方法是同步块吗?

    4. 无论是否调用.force()方法,都有很大的性能差异。手动调用.force()有什么好处?在什么情况下我们应该使用它?我假设在不调用它的情况下,数据仍将被写入场景后面的磁盘。

    5. 如果我们需要调用.force(),从另一个线程调用它有助于提高性能吗?它会因为同步问题而损坏数据吗?

      导入java.io.fileNotFoundException; 导入java.io.ioexception; 导入java.io.randomaccessfile; 导入java.nio.mappedByteBuffer; 导入java.nio.channels.filechannel; 导入java.nio.channels.filechannel.mapmode;

    公共类主{

    public static void main(String[] args) throws IOException {
        System.out.println("start");
    
        RandomAccessFile raf = new RandomAccessFile("test.map", "rw");
        FileChannel fc = raf.getChannel();
        MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 2000000);
    
        int total = 0;
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 2000000; i += 4) {
            mbb.putInt(i, i);
            //mbb.force();
            total += mbb.getInt(i);
        }
        long stopTime = System.currentTimeMillis();
    
        System.out.println(total);
        System.out.println(stopTime - startTime);
        System.out.println("stop");
    }
    

    }

    4 回复  |  直到 13 年前
        1
  •  3
  •   user207421    13 年前
    1. 只有当您有极端的事务性需求时,即您正在实现一个数据库时,才应该调用它。getint()从内存中读取:操作系统将文件分页到内存中或从内存中调出。

    2. 未指定。

    3. 如果如此指定,则同步方法。这与它们是否阻塞无关。

    4. 见(1)。数据仍将被写入,但这取决于操作系统的一时兴起,而不是你的。

    5. 我对此表示怀疑,但请看(2),我怀疑你是否需要打电话给它,请看(1)。

        2
  •  4
  •   Yao    13 年前

    mappedByteBuffer.force()是 在窗户里没用。我使用了来自 http://technet.microsoft.com/en-us/sysinternals/bb896645 监控文件访问。根据日志记录,mappedByteBuffer.force()将立即在中调用Windows API WriteFile()。 非缓存同步模式 . 可靠性应该类似于filechannel.force(),它将立即调用Windows API FlushFileBuffers()来写入文件。因此,mappedByteBuffer.force()对于大多数用途都是足够可靠的。用Java 1.60y24在Windows 7 64位上进行测试。

        3
  •  2
  •   Martijn Verburg    14 年前

    好吧,用一点盐来回答(我不是NIO专家)

    1) putInt(i, i) 将写入内存中的mappedbytebuffer(mbb),操作系统将该值传输到实际的基础文件中( test.map )当它想的时候。

    使用 force() 通知操作系统“立即”传输数据(如果您有另一个需要从该文件中读取的进程,则这一点很有用)。

    你的 getInt(i) 如果使用 强制() 这样一来,您就知道在引擎盖下,您的文件与内存缓冲区是同步的)。

    很可能你不需要使用 强制()

    2)不确定,我 认为 这是因为Java 7 NiO。2的东西开始暗示能够以非阻塞的方式完成这类事情。我现在还在研究这个问题。

    3.)这是两个独立的问题。我建议你看看道格·利亚的书——)。

    4.)如1.)所述,force()将告诉操作系统“立即”写入,否则操作系统会在感觉到的时候写入。

        4
  •  1
  •   Thommy    14 年前

    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6816049

    force()在Windows上无效。非常可怕的虫子。