我使用MappedByteBuffer在linux中编写文件.
File file = new File("testFile");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbf = fc.map(FileChannel.MapMode.READ_WRITE, 0, file.length());
mbf.put(buffer);
如果testFile写入500MB,并且写入500MB数据两次,则需要1s.但是当我使用testFile时,写入500MB数据需要4s.
为什么覆盖文件比写新文件更快?如何以覆盖文件的速度更快地编写新文件?
解决方法:
覆盖或创建新文件的速度更快取决于文件系统类型.许多文件系统都会覆盖文件数据;然后覆盖更快,因为它只需要写入数据,而创建新文件需要先分配空间然后在新分配的空间中写入数据.我不希望有太大的不同.某些文件系统不会覆盖现有块(允许a write to be undone),然后通过写入新数据然后删除旧数据来覆盖现有文件.不过,我不认为两种情况都会有很大差异.
底层可以具有类似的效果,使一个操作比另一个更昂贵.例如,覆盖保留快照的系统会保留旧数据,以便可以恢复快照. Flash媒体只能批量擦除,因此新数据会写入空闲扇区,但覆盖某些数据最终会导致其被释放,这需要时间.
到目前为止,对读写时序影响最大的是缓冲和缓存.确保您在已知的缓存配置中执行基准测试(您应该在开始每个基准测试操作之前刷新磁盘缓存)并以缓冲区全部写入结束(通过调用sync完成),除非您要测量热缓存/缓冲区时序.例如,执行两次连续写操作,其中第一次写入仅写入内存缓冲区将不会比执行单次写入花费更多.
在任何情况下,如果需要4秒来完成你想要的操作,那么它需要4秒.没有什么神奇的方法可以让它快4倍.
标签:performance,linux,filesystems,files
来源: https://codeday.me/bug/20190814/1656450.html