【问题标题】:comparing big csv files using hashmap or hashset使用 hashmap 或 hashset 比较大的 csv 文件
【发布时间】:2018-06-13 01:12:40
【问题描述】:

我正在尝试比较两个巨大的 CSV 文件。第一个文件 (id.csv) 由用户 ID 组成,第二个文件 (data.csv) 由原始数据组成。我正在尝试迭代第一个文件中的每个 id 并从第二个文件中找到相同 id 的所有原始数据并写入新文件。我已经尝试了以下简单代码,但我认为这将需要一个多月的时间来处理。请帮助实现可以更快处理的代码。

    public class FilterUser {

    public static String UniqueUser = "D:/test/id.csv";
    public static String Raw = "D:/test/data.csv";
    public static String OutputFile = "D:/test/output.csv";
    public static void main(String[] args) throws IOException 
    {
        Scanner ScanIn1 = null;
        String users = "";
        String[] record;
        ArrayList<String> InArray = new ArrayList<>();
        String line;
        long startTime = System.currentTimeMillis();

    try{    
        ScanIn1 =  new Scanner(new BufferedReader(new FileReader(UniqueUser)));
        BufferedReader br = new BufferedReader(new FileReader(Raw));
        BufferedWriter bw = new BufferedWriter(new FileWriter(OutputFile));
        bw.write("id,date,time,Use_duration,book1,book2");
        bw.newLine();

        while(ScanIn1.hasNext()){
            users = ScanIn1.nextLine();
            InArray.add(users);
        }
        while((line = br.readLine()) != null){
            record = line.split(",");
            for(int i=0; i<InArray.size(); i++){
                if(InArray.get(i).equals(record[0])){
                    String output = record[0] + "," + record[1] + "," + record[2] + "," + record[3] + "," + record[4]+ "," + record[5];
                    bw.write(output);
                    bw.newLine();
                }
            }
            }

        br.close();
        bw.close();
        ScanIn1.close();
        }
        catch (FileNotFoundException ex){
            System.out.println(ex);
        }
        catch (IOException ex){
            System.out.println(ex);
        }
    long endTime = System.currentTimeMillis();
    long TotalTime = endTime - startTime;
    System.out.println("Total time =" + TotalTime);
    }

}

id.csv

data.csv

【问题讨论】:

  • 对文件进行排序将有助于减少研究(使用排序集和二进制搜索)。您可以使用一个小型数据库来帮助您进行连接(如 SQLITE)。如果没有关于文件的更多信息,真的不能说更多(这需要一个月的时间,这应该超过 1 TB 的数据......)。 PS:标题中提到的地图和布景在哪里?
  • @AxelH 是的,第一个文件是 0.5GB,第二个文件是 15GB。实际上,我提到了地图和集合,以询问我如何实现它们以更快地运行此代码。
  • 你的 id 值总是 3 位数字吗??
  • 在两个文件中都按 ID 排序是不可靠的吗?如果是这样,只需同时迭代这两个文件。
  • @Nithin 我的 id 值包含 10 位数字,感谢您帮助我,我会尝试使用您重写的代码。

标签: java csv hashmap compare hashset


【解决方案1】:

您的代码可以用 hashSet 替换 arraylist 重写。因为使用 hashSet 的 contains() 方法,代码变得高效。 contains() 方法的效率为 O(1)。因此,您可以避免使用 2 个循环(while 和 for)进行验证。

public class FilterUser {

    public static String UniqueUser = "D:/test/id.csv";
    public static String Raw = "D:/test/data.csv";
    public static String OutputFile = "D:/test/output.csv";
    public static void main(String[] args) throws IOException 
    {
        Scanner ScanIn1 = null;
        String users = "";
        String id = "";
        HashSet<String> InArray = new HashSet<String>();
        String line;
        long startTime = System.currentTimeMillis();

    try{    
        ScanIn1 =  new Scanner(new BufferedReader(new FileReader(UniqueUser)));
        BufferedReader br = new BufferedReader(new FileReader(Raw));
        BufferedWriter bw = new BufferedWriter(new FileWriter(OutputFile));
        bw.write("id,date,time,Use_duration,book1,book2");
        bw.newLine();

        while(ScanIn1.hasNext()){
            users = ScanIn1.nextLine();
            InArray.add(users);
        }
        while((line = br.readLine()) != null){

            id=line.substring(0, 3);
            if(InArray.contains(id)){
                bw.write(line);
                bw.newLine();
            }
            }

        br.close();
        bw.close();
        ScanIn1.close();
        }
        catch (FileNotFoundException ex){
            System.out.println(ex);
        }
        catch (IOException ex){
            System.out.println(ex);
        }
    long endTime = System.currentTimeMillis();
    long TotalTime = endTime - startTime;
    System.out.println("Total time =" + TotalTime);
    }

}

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多