如何在java中高效地读取一个巨大的文本文件,并将其内容拆分以进行排序?

如何在java中高效地读取一个巨大的文本文件,并将其内容拆分以进行排序?,java,file,sorting,Java,File,Sorting,我的文本文件结构如下(大约360741KB): 由于我需要按名称对文件进行排序,所以我尝试将其放在LinkedList中,以便通过诸如合并排序或快速排序之类的算法对其进行排序 我的问题是,拆分每一行并将其放置在LinkedList中需要太长时间 你们能给我推荐一种更省时的方法吗 我在做什么: try { BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\MyDirectory\\File.tx

我的文本文件结构如下(大约360741KB):

由于我需要按名称对文件进行排序,所以我尝试将其放在LinkedList中,以便通过诸如合并排序或快速排序之类的算法对其进行排序

我的问题是,拆分每一行并将其放置在LinkedList中需要太长时间

你们能给我推荐一种更省时的方法吗

我在做什么:

   try {
        BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\MyDirectory\\File.txt"));
        String str;
        LinkedList<Persona> li = new LinkedList();
        while ((str = in.readLine()) != null) {
            //System.out.println(str);
            String[] array = str.split(",");

             //Take the values from the array to create an instance of the class and place it in the LinkedList.
            li.add(new Persona(array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]));
            //System.out.println(str);
        }
        System.out.println("fin");
        in.close();
    } catch (IOException e) {
        System.out.println("File Read Error");
    }

}
试试看{
BufferedReader in=new BufferedReader(新文件读取器(“C:\\Users\\MyDirectory\\File.txt”);
字符串str;
LinkedList li=新建LinkedList();
而((str=in.readLine())!=null){
//系统输出打印项次(str);
字符串[]数组=str.split(“,”);
//从数组中获取值以创建类的实例,并将其放置在LinkedList中。
添加(新角色(数组[0]、数组[1]、数组[2]、数组[3]、数组[4]、数组[5]、数组[6]、数组[7]);
//系统输出打印项次(str);
}
系统输出打印项次(“fin”);
in.close();
}捕获(IOE异常){
System.out.println(“文件读取错误”);
}
}

LinkedList在内存方面不是特别有效,对内置排序算法也没有好处。我建议您将每一行加载到一个数组列表中,并仅按名称将其拆分(不是每个字段,因为您不需要拆分它们)

您可以使用Collections.sort和自定义比较器对ArrayList进行排序


注意:您可以预期352MB的文本将使用至少1GB的内存,我建议使用2-4GB的内存来提高性能。

LinkedList在内存方面不是特别有效,对内置排序算法也没有好处。我建议您将每一行加载到一个数组列表中,并仅按名称将其拆分(不是每个字段,因为您不需要拆分它们)

您可以使用Collections.sort和自定义比较器对ArrayList进行排序


注意:您可以预期352MB的文本将使用至少1GB的内存,我建议使用2-4GB的内存来提高性能。

LinkedList在内存方面不是特别有效,对内置排序算法也没有好处。我建议您将每一行加载到一个数组列表中,并仅按名称将其拆分(不是每个字段,因为您不需要拆分它们)

您可以使用Collections.sort和自定义比较器对ArrayList进行排序


注意:您可以预期352MB的文本将使用至少1GB的内存,我建议使用2-4GB的内存来提高性能。

LinkedList在内存方面不是特别有效,对内置排序算法也没有好处。我建议您将每一行加载到一个数组列表中,并仅按名称将其拆分(不是每个字段,因为您不需要拆分它们)

您可以使用Collections.sort和自定义比较器对ArrayList进行排序


注意:您可以预期352 MB的文本将使用至少1 GB的内存,我建议为其提供2-4 GB的内存以提高性能。

这将需要5个不同的步骤:

1) 将文件拆分为多个部分(当然,您知道这一点,可能是10MB的块)。通过看起来很小的ram容量可以管理的东西

2) 分别对每个块进行排序。保存到自己的文件(这是为了便于管理)

3) 以A-Z字母作为文件名将每个已排序的列表合并为单独的文件(或根据A与Z的比较数量而定,如A1.txt A2.txt A3.txt…等)

4) 在单独的较大文件中按组对合并的文件进行排序。(所有的A然后是B……等等)

5) 将文件合并为一个大文件(如果您愿意)顺序相应


注意:这也称为
外部排序
。你不应该使用LinkedList。尝试类似向量或一些已构建的排序函数。

这将需要5个不同的步骤:

1) 将文件拆分为多个部分(当然,您知道这一点,可能是10MB的块)。通过看起来很小的ram容量可以管理的东西

2) 分别对每个块进行排序。保存到自己的文件(这是为了便于管理)

3) 以A-Z字母作为文件名将每个已排序的列表合并为单独的文件(或根据A与Z的比较数量而定,如A1.txt A2.txt A3.txt…等)

4) 在单独的较大文件中按组对合并的文件进行排序。(所有的A然后是B……等等)

5) 将文件合并为一个大文件(如果您愿意)顺序相应


注意:这也称为
外部排序
。你不应该使用LinkedList。尝试类似向量或一些已构建的排序函数。

这将需要5个不同的步骤:

1) 将文件拆分为多个部分(当然,您知道这一点,可能是10MB的块)。通过看起来很小的ram容量可以管理的东西

2) 分别对每个块进行排序。保存到自己的文件(这是为了便于管理)

3) 以A-Z字母作为文件名将每个已排序的列表合并为单独的文件(或根据A与Z的比较数量而定,如A1.txt A2.txt A3.txt…等)

4) 在单独的较大文件中按组对合并的文件进行排序。(所有的A然后是B……等等)

5) 将文件合并为一个大文件(如果您愿意)顺序相应


注意:这也称为
外部排序
。你不应该使用LinkedList。尝试类似向量或一些已构建的排序函数。

这将需要5个不同的步骤:

1) 将文件拆分为多个部分(当然,您知道这一点,可能是10MB的块)。通过看起来很小的ram容量可以管理的东西

2) 分别对每个块进行排序。保存到自己的文件(这是为了便于管理)

3) 以A-Z字母作为文件名将每个排序的列表合并为单独的文件(或根据与Z比较的A数量而定,如A1.txt A2.txt A)
   try {
        BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\MyDirectory\\File.txt"));
        String str;
        LinkedList<Persona> li = new LinkedList();
        while ((str = in.readLine()) != null) {
            //System.out.println(str);
            String[] array = str.split(",");

             //Take the values from the array to create an instance of the class and place it in the LinkedList.
            li.add(new Persona(array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]));
            //System.out.println(str);
        }
        System.out.println("fin");
        in.close();
    } catch (IOException e) {
        System.out.println("File Read Error");
    }

}