Java 如何以块的形式读取要存储在内存中的文件
我在练习时遇到了一个问题,就是如何从一个文件中对数字进行排序,这个文件太大,无法放入内存。我不知道怎么做,所以我想我会试试。我最终找到了外部排序,我基本上只是尝试用这个概念和代码来解决这个问题。我正在练习的文本文件没有那么大,无法放入内存;我只是想学习如何完成这样的事情到目前为止我从文件中读取了3个块,每个块500行,对块进行排序,然后将结果块写入自己的文件中。这是有效的。。。虽然我不确定我的实现是如何实现外部排序流程的:Java 如何以块的形式读取要存储在内存中的文件,java,external-sorting,Java,External Sorting,我在练习时遇到了一个问题,就是如何从一个文件中对数字进行排序,这个文件太大,无法放入内存。我不知道怎么做,所以我想我会试试。我最终找到了外部排序,我基本上只是尝试用这个概念和代码来解决这个问题。我正在练习的文本文件没有那么大,无法放入内存;我只是想学习如何完成这样的事情到目前为止我从文件中读取了3个块,每个块500行,对块进行排序,然后将结果块写入自己的文件中。这是有效的。。。虽然我不确定我的实现是如何实现外部排序流程的: import java.util.*; import java.io.*
import java.util.*;
import java.io.*;
public class ExternalSort{
public static void main(String[] args) {
File file = new File("Practice/lots_of_numbers.txt");
final int NUMBER_OF_CHUNKS = 3;
final int AMOUNT_PER_CHUNK = 500;
int numbers[][] = new int[NUMBER_OF_CHUNKS][AMOUNT_PER_CHUNK];
try{
Scanner scanner = new Scanner(file);
for(int i = 0; i < NUMBER_OF_CHUNKS; i++){
//Just creating a new file name for each chunk
StringBuilder sortedFileName = new StringBuilder().append("sortedFile").append(i).append(".txt");
for(int j = 0; j < AMOUNT_PER_CHUNK; j++){
numbers[i][j] = Integer.parseInt(scanner.nextLine());
}
Arrays.sort(numbers[i]);
saveResultsToFile(sortedFileName.toString(),numbers[i]);
}
scanner.close();
}catch(FileNotFoundException e){
System.out.println("Error: " + e);
}
}
public static void saveResultsToFile(String fileName, int arr[]){
try{
File file = new File(fileName);
PrintWriter printer = new PrintWriter(file);
for(int i : arr)
printer.println(i);
printer.close();
}catch(FileNotFoundException e){
System.out.println("Error :" + e);
}
}
}
import java.util.*;
导入java.io.*;
公共类外部排序{
公共静态void main(字符串[]args){
File File=新文件(“Practice/lots\u of_numbers.txt”);
块的最终整数=3;
每个区块的最终整数金额=500;
整数[][]=新整数[块的数量][每个块的数量];
试一试{
扫描仪=新扫描仪(文件);
for(int i=0;i<块的数量;i++){
//只是为每个块创建一个新的文件名
StringBuilder sortedFileName=new StringBuilder().append(“sortedFile”).append(i.append(.txt”);
对于(int j=0;j
我的问题是我应该如何将一个文件分解成块?我碰巧知道我的文件有多少行文本,因为我创建了它,所以写这段代码很容易…但问题实际上告诉你文件的大小;正如在内存中一样,文件中没有多少行文本。我不确定如何将数据分解为“内存块”(以及如何调整它们的大小),而不是文本行。另外,如果我的代码有什么奇怪的地方,错误的地方,或者糟糕的做法,请告诉我,因为我真的不知道我在做什么;我只是想学。至于合并排序后的文件,我也不知道怎么做,但我有个主意。在我请求帮助之前,我想试一下。谢谢 这是如何获得要将文件分解成的块的大小:
public static long chunkSize(File file){
//We don't want to create more that 1024 temp files for sorting
final long MAX_AMOUNT_OF_TEMP_FILES = 1024;
long fileSize = file.length();
long freeMemory = Runtime.getRuntime().freeMemory();
//We want to divide the file size by the maximum amount of temp files we will use for sorting
long chunkSize = fileSize / MAX_AMOUNT_OF_TEMP_FILES;
//If the block size is less than half the available memory, then we can stand to make the block size larger
if(chunkSize < freeMemory / 2)
chunkSize = freeMemory / 2;
else
System.out.println("Me may potentially run out of memory");
return chunkSize ;
}
public静态长chunkSize(文件){
//我们不想创建超过1024个临时文件进行排序
临时文件的最终长最大数量=1024;
long fileSize=file.length();
long freemory=Runtime.getRuntime().freemory();
//我们希望将文件大小除以用于排序的临时文件的最大数量
long chunkSize=文件大小/临时文件的最大数量;
//如果块大小小于可用内存的一半,那么我们可以将块大小变大
if(chunkSize
我建议您使用BufferedReader
而不是扫描仪来打开文件,尤其是当文件较大时。谢谢您的建议。有什么原因吗?我不熟悉BufferedReader类,使用BufferedReader
可以读取缓冲区中的一小部分文件(字符数可以更改或保留为默认大小),这样您就不必担心内存不足。谢谢。!我将研究如何使用它。