将大文本文件加载到int数组中的最快方法

时间:2016-08-21 23:06:25

标签: java arrays performance

我有一个大文本文件(+ 100MB),每行是一个整数(包含1000万个数字)。当然,尺寸和数量可能会有所变化,所以我事先并不知道。

我想将文件加载到ECHO is off. ECHO is off. ECHO is off. ECHO is off. ECHO is off. ECHO is off. ECHO is off. ECHO is off. 0 1 2 3 4 5 6 ,使过程尽可能快。首先我来到这个解决方案:

int[]

非常快,5.5秒。其中,5.1s用于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; } 调用,而0.4s用于循环。

但后来我决定尝试使用BufferedReader,并找到了这个不同的解决方案:

readAllLines

这更快! 3.1秒,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秒。

我知道这里没有太多的优化空间,至少在时间上,但是使用ArrayList然后使用int []对我来说似乎有太多的记忆。

关于如何加快速度,或避免使用中间ArrayList的任何想法?

为了进行比较,我使用for类和TStringList函数在1.9秒内使用FreePascal执行相同的任务[请参阅编辑]。

编辑:由于我使用Java方法的时间很短,我不得不改进FreePascal。 330〜360ms。

1 个答案:

答案 0 :(得分:7)

如果您正在使用Java 8,则可以使用lines()消除此中间ArrayList,然后映射到int,然后将值收集到数组中。< / p>

您还应该使用try-with-resources进行正确的异常处理和自动关闭。

try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
    return br.lines()
             .mapToInt(Integer::parseInt)
             .toArray();
}

我不确定这是否更快,但维护起来肯定要容易得多。

编辑:显然要快得多。