[英]How to read a file in chunks that is to large to be stored in memory
我正在练习,碰到一个问题,就是要从一个大到适合内存的文件中对数字进行排序。 我不知道该怎么做,所以我想尝试一下。 我最终找到了外部排序,而我基本上只是想采用这个概念并编写解决此问题的解决方案。 我正在练习的文本文件太大了,无法放入内存; 我只是想学习如何完成这样的事情。 到目前为止,我正在从文件中读取3个块,每个块500行,对这些块进行排序,然后将结果块写入其自己的文件中。 尽管我不确定我的实现方式是如何实现外部排序过程的,但是这仍然有效:
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);
}
}
}
我的问题是我应该如何将文件分解成块? 我碰巧确切地知道我的文件有多少行文本,因为我创建了它,因此编写此代码很容易...但是问题实际上告诉了您文件的大小; 就像在内存中一样,不是文件多少行文本。 我不确定如何将数据分解为“内存块”(以及如何调整大小),而不是文本行。 另外,如果我的代码有任何怪异,错误或错误的做法,请告诉我,因为我真的不知道我在做什么; 我只是想学习。 至于将排序后的文件重新合并在一起,我也不知道该怎么做,但是我有一个主意。 在寻求帮助之前,我想尝试一下。 谢谢!
这是如何获取我们要将文件拆分成的块的大小的方法:
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 ;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.