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