java加速文件读取
我有一个1.7G文件,格式如下:
String Long String Long String Long String Long ... etc
本质上,String是一个键,Long是hashmap中的一个值,我感兴趣的是在运行应用程序中的任何其他内容之前进行初始化
我目前的代码是:
RandomAccessFile raf=new RandomAccessFile("/home/map.dat","r");
raf.seek(0);
while(raf.getFilePointer()!=raf.length()){
String name=raf.readUTF();
long offset=raf.readLong();
map.put(name,offset);
}
这需要大约12分钟来完成,我相信有更好的方法来完成这一点,所以我将感谢任何帮助或指针
谢谢
是否按照EJP建议更新强>
谢谢你的建议,我希望这就是你的意思。如果这是错误的,请纠正我
DataInputStream dis=null;
try{
dis=new DataInputStream(new BufferedInputStream(new FileInputStream("/home/map.dat")));
while(true){
String name=dis.readUTF();
long offset=dis.readLong();
map.put(name, offset);
}
}catch (EOFException eofe){
try{
dis.close();
}catch (IOException ioe){
ioe.printStackTrace();
}
}
# 1 楼答案
我将构造该文件,以便在适当的位置使用它。i、 e.不以这种方式加载。由于您有可变长度的记录,您可以构造每个记录位置的数组,然后按顺序放置键,以便对数据执行二进制搜索。(或者您可以使用自定义哈希表)然后可以使用方法包装此文件,该方法隐藏数据实际上存储在文件中,而不是转换为数据对象
如果您执行所有这些操作,“加载”阶段将变得多余,您将不需要创建这么多对象
这是一个很长的例子,但希望能说明什么是可能的
生成2GB的原始数据并执行一百万次查找。它的编写方式使得加载和查找使用的堆很少。(<;<;1MB)
每次查找使用哈希表会更快,因为它是O(1)而不是O(ln),但实现起来更复杂
# 2 楼答案
使用围绕FileInputStream的BufferedInputStream包装的DataInputStream
与每次迭代至少四次系统调用、检查长度和当前大小并执行谁知道有多少次读取来获取字符串和long不同,只需调用readUTF()和readLong(),直到获得EOFEException