我尝试使用java编写数据管理工具。 我需要使用高效的随机文件来读写。 我尝试使用朋友推荐的文件映射。 但效果似乎并不好。 我使用RandomAccessFile以比MappedByteBuffer快10倍的速度读写文件。
File file = new File("D:\\testdb");
if (!file.exists()) {
file.createNewFile();
}
RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
accessFile.setLength(65536);
FileChannel fileChannel = accessFile.getChannel();
Random random = new Random(0);
{
long time = System.nanoTime();
for (int i = 0; i < 1024; i++) {
byte[] data = new byte[4096];
accessFile.seek(4096);
accessFile.read(data, 0, 4096);
accessFile.seek(4096);
accessFile.write(data);
}
System.out.println(System.nanoTime() - time);
Thread.sleep(1000);
}
{
long time = System.nanoTime();
for (int i = 0; i < 1024; i++) {
MappedByteBuffer buffer = fileChannel.map(MapMode.READ_WRITE, 12288, 4096);
buffer.force();
}
System.out.println(System.nanoTime() - time);
}
我想知道MappedByteBuffer的优势在哪里?
我添加了数据来读写。花费的时间更加明显。
{
long time = System.nanoTime();
for (int i = 0; i < 1024; i++) {
byte[] data = new byte[4096];
accessFile.seek(4096);
accessFile.read(data, 0, 4096);
for (int j = 0; j < data.length; j++) {
data[j] = data[data.length - j - 1];
}
accessFile.seek(4096);
accessFile.write(data);
}
System.out.println(System.nanoTime() - time);
}
{
long time = System.nanoTime();
for (int i = 0; i < 1024; i++) {
MappedByteBuffer buffer = fileChannel.map(MapMode.READ_WRITE, 12288, 4096);
for (int j = 0; j < buffer.capacity(); j++) {
buffer.put(j, buffer.get(buffer.capacity() - j - 1));
}
buffer.force();
}
System.out.println(System.nanoTime() - time);
}
Output:
39655738
11786737561
我尝试做数据管理,这里是缓存。 已经加载到数据的内存中不需要关心。 因为必须读取或写入数据。 必须在结束后与文件同步。 如果这些数据未被修改。 不需要同步。 这将进一步节省时间。 RandomAccessFile的优势将更加明显
答案 0 :(得分:2)
您正在比较apply和oranges。
您正在通过IN.Tags.Share.handleCount
比较查找和读取数据的时间,以及通过RandomAccessFile
创建映射的时间。创建映射会在幕后执行很多操作,但它不会执行任何I / O.
您应该测试的是从字节4097-8192获取数据,并重写1024次。没有创建1024次映射。没有人能够做到这一点。
你的测试没有意义。