我有一个大文本文件(+100MB),每行都是一个整数(包含一千万个数字)。当然,大小和数量可能会改变,所以我事先不知道这些。
我想将文件加载到一个
这次更快了!只用了3秒钟的
我知道在这里优化的空间不多,至少在时间上是这样,但是使用ArrayList然后再使用int[]对我来说似乎太占内存了。
有什么想法可以让它更快,或者避免使用中间的ArrayList吗?
仅供比较,我使用FreePascal在1.9秒钟内完成了相同的任务[请参见编辑],使用了
编辑:由于我用Java方法得到了一个相当短的时间,所以我不得不改进FreePascal方法。330~360毫秒。
我想将文件加载到一个
int[]
中,并使过程尽可能快。首先,我想到了以下解决方案:public int[] fileToArray(String fileName) throws IOException
{
List<String> list = Files.readAllLines(Paths.get(fileName));
int[] res = new int[list.size()];
int pos = 0;
for (String line: list)
{
res[pos++] = Integer.parseInt(line);
}
return res;
}
速度相当快,只需5.5秒。其中,readAllLines
调用耗时5.1秒,循环耗时0.4秒。
然后我决定尝试使用 BufferedReader,并得到了这种不同的解决方案:
public int[] fileToArray(String fileName) throws IOException
{
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(fileName)));
ArrayList<Integer> ints = new ArrayList<Integer>();
String line;
while ((line = bufferedReader.readLine()) != null)
{
ints.add(Integer.parseInt(line));
}
bufferedReader.close();
int[] res = new int[ints.size()];
int pos = 0;
for (Integer i: ints)
{
res[pos++] = i.intValue();
}
return res;
}
这次更快了!只用了3秒钟的
while
循环和不到0.1秒钟的for
循环,总共只用了3.1秒钟。我知道在这里优化的空间不多,至少在时间上是这样,但是使用ArrayList然后再使用int[]对我来说似乎太占内存了。
有什么想法可以让它更快,或者避免使用中间的ArrayList吗?
仅供比较,我使用FreePascal在1.9秒钟内完成了相同的任务[请参见编辑],使用了
TStringList
类和StrToInt
函数。编辑:由于我用Java方法得到了一个相当短的时间,所以我不得不改进FreePascal方法。330~360毫秒。