【发布时间】:2011-02-11 04:50:45
【问题描述】:
我有一个包含1 000 002 数字的文本文件,格式如下:
123 456
1 2 3 4 5 6 .... 999999 100000
现在我需要读取该数据并将其分配给 int 变量(前两个数字)和所有其余的(1 000 000 个数字)到数组 int[]。
这不是一项艰巨的任务,但是 - 速度太慢了。
我的第一次尝试是java.util.Scanner:
Scanner stdin = new Scanner(new File("./path"));
int n = stdin.nextInt();
int t = stdin.nextInt();
int array[] = new array[n];
for (int i = 0; i < n; i++) {
array[i] = stdin.nextInt();
}
它在例外情况下工作,但执行大约需要 7500 毫秒。我需要在数百毫秒内获取该数据。
然后我试了java.io.BufferedReader:
使用 BufferedReader.readLine() 和 String.split() 我在大约 1700 毫秒 内得到了相同的结果,但仍然太多了。
如何在不到 1 秒的时间内读取这么多数据?最终结果应该等于:
int n = 123;
int t = 456;
int array[] = { 1, 2, 3, 4, ..., 999999, 100000 };
根据trashgod的回答:
StreamTokenizer 解决方案很快(大约需要 1400 毫秒)但仍然太慢:
StreamTokenizer st = new StreamTokenizer(new FileReader("./test_grz"));
st.nextToken();
int n = (int) st.nval;
st.nextToken();
int t = (int) st.nval;
int array[] = new int[n];
for (int i = 0; st.nextToken() != StreamTokenizer.TT_EOF; i++) {
array[i] = (int) st.nval;
}
PS。无需验证。我 100% 确定 ./test_grz 文件中的数据是正确的。
【问题讨论】:
-
为什么不将它们存储到 LinkedList {如果你要在列表中移动它们或对它们进行排序} 或 ArrayList(如果你想要随机访问}(取决于你如何'会使用它们)?这是大量数据,我假设您稍后会使用它们。
-
我已经改变了我的问题 - 它只是关于从文件中读取。 ;) 我不需要任何集合 - 简单数组是我真正需要的,但问题是如何以最快的方式用文件中的数据填充这个数组。
-
大数组(近 4MB)的分配与解析花费了多少时间?您可以在该调用之外分配数组吗?假设您使用的是 Integer.parseInt,您是否寻找过任何其他可能优化了以 10 为底的整数解析的库?这声称:cs.ou.edu/~weaver/improvise/downloads/javadoc/oblivion/oblivion/…
-
只是抛出一些想法-您可以创建一个单独的程序将文件拆分为多个文件,然后使用单独的线程读取数据,然后组合结果吗?虽然会使整个设计更加复杂。也不确定它会更快。
-
@JRL:这是不可能的。一切都必须在这个程序中以最简单、最原始但快速的方式完成。
标签: java performance optimization input