从多个文件中读取数据并应用业务逻辑

时间:2014-10-10 18:37:55

标签: java multithreading performance optimization nio

大家好,请帮我实现这个场景,我有多个文件,如aaa.txt,bbb.txt,ccc.txt,数据为

aaa.txt

100110,StringA,22
200110,StringB,2
300110,StringC, 12
400110,StringD,34
500110,StringE,423

bbb.txt as:

100110,StringA,20.1
200110,StringB,2.1  
300110,StringC, 12.2
400110,StringD,3.2
500110,StringE,42.1

ccc.txt 为:

100110,StringA,2.1
200110,StringB,2.1  
300110,StringC, 11
400110,StringD,3.2
500110,StringE,4.1

现在我必须阅读所有三个文件(大文件)并将结果报告为 100110:(22,20.1,2.1)。 问题在于文件的大小以及如何以优化的方式实现这一目标。

3 个答案:

答案 0 :(得分:1)

我假设您有一些代码可以逐行处理文件,因此我会伪造一个可以保持拉线的扫描程序。

处理此问题的最简单方法是使用Map。在这种情况下,我只使用HashMap。

    HashMap<String, String[]> map = new HashMap<>();

    while (aaa.hasNextLine()) {
        String[] lineContents = aaa.nextLine().split(",");
        String[] array = new String[3];
        array[0] = lineContents[2].trim();
        map.put(lineContents[0], array);
    }

    while (bbb.hasNextLine()) {
        String[] lineContents = bbb.nextLine().split(",");
        String[] array = map.get(lineContents[0]);
        if (array != null) {
            array[1] = lineContents[2].trim();
            map.put(lineContents[0], lineContents[2].trim());
        } else {
            array = new String[3];
            array[1] = lineContents[2].trim();
            map.put(lineContents[0], array);
        }
    }

    // same for c, with a new index of 2

要添加同步性,您可能会使用其中一个maps

然后你创建3个只读和放的线程。

答案 1 :(得分:0)

除非您在加载这些文件时进行大量处理,或者正在读取大量较小的文件,否则它可能更适合作为顺序操作。

答案 2 :(得分:0)

如果您的文件都是有序的,只需保持一个Scanner数组指向您的文件并逐个读取行,然后在文件中输出结果文件。

这样做,您只会在内存中保留与文件数量相同的行数。它既节省时间又节省内存。

如果您的文件未订购,则可以使用sort命令对其进行排序。