繁体   English   中英

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

[英]Fastest way to load huge text file into a int array

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

我想将文件加载到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秒。 其中,5.1s用于readAllLines调用,而0.4s用于循环。

但后来我决定尝试使用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.1秒,只为3秒while循环并为连0.1秒for循环。

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

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

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

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

如果您使用的是Java 8,则可以使用lines()然后映射到int ,然后将值收集到数组中来消除此中间ArrayList

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

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

我不确定这是否更快,但它肯定更容易维护。

编辑:它显然要快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM