我正在使用FileInputStream将文件内容放入字节数组的文本文件中读取.然后我使用新的String(byte)将字节数组转换为String.
一旦我有了我正在使用的字符串String.split("\n")将文件拆分成一个String数组,然后获取该字符串数组并通过执行a String.split(",")并在Arraylist中保存内容来解析它.
我有一个200MB +的文件,当我使用1GB内存启动JVM时,内存不足.我知道我必须在某处正确地做某事,我只是不确定我解析的方式是不正确的还是我正在使用的数据结构.
它也花了我大约12秒来解析文件似乎很多时间.任何人都可以指出我可能在做什么导致我内存不足以及可能导致我的程序运行缓慢的原因?
该文件的内容如下所示:
"12334", "100", "1.233", "TEST", "TEXT", "1234"
"12334", "100", "1.233", "TEST", "TEXT", "1234"
.
.
.
"12334", "100", "1.233", "TEST", "TEXT", "1234"
Run Code Online (Sandbox Code Playgroud)
谢谢
Cog*_*gsy 13
我不确定它在内存方面的效率如何,但我的第一种方法是使用扫描仪,因为它非常容易使用:
File file = new File("/path/to/my/file.txt");
Scanner input = new Scanner(file);
while(input.hasNext()) {
String nextToken = input.next();
//or to process line by line
String nextLine = input.nextLine();
}
input.close();
Run Code Online (Sandbox Code Playgroud)
检查API以了解如何更改用于拆分令牌的分隔符.
听起来你对我做错了 - 一个完整的对象创造正在进行中.
这个"测试"文件的代表性如何?你在用这些数据做什么?如果那是你真正拥有的典型内容,我会说这些数据有很多重复.
如果它总是在Strings中,那么从BufferedReader开始读取每一行.将该List预分配到接近您所需的大小,这样您就不会浪费资源每次都添加到它.用逗号分隔每一行; 一定要剥掉双引号.
您可能想问自己:"为什么我需要在内存中同时使用整个文件?" 你能读一点,处理一点,并且永远不会把整个事情记在内存中吗?只有你能够很好地了解你的问题才能回答.
如果你有JDK 6,也许你可以启动jvisualvm并查看内存发生了什么.这将是一个很好的线索.