Мне недавно нужно было отсортировать однострочный файл (целые числа, разделенные ",") на более мелкие куски с учетом ограничений памяти и эффективности.В настоящее время я придерживаюсь этой логики:
File file = new File("bigfile.txt");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int BUFFER_SIZE = 10; // can and should be bigger
byte[] bytes = new byte[BUFFER_SIZE];
while ((bis.read(bytes)) != -1) {
// convert bytes to string
// split bytes to String[]
// save the last number if was cut in the middle and save it for the next round of reading and remove it from the current String[]
// fix cut number if necessary and put it in the String[]
// sort the String[]
// write the String[] into a file
// call Garbage collector to prevent memory leak?
}
bis.close();
Предполагая, что я ограничен 5 МБ памяти и мне нужно прочитать однострочный файл с 10 000 000 целых чисел, разделенных ",":
- Если я использую очень маленький размер буфера (например, 10) для чтения файла, я создам тысячи файлов.
- Если я использую приличный, но все еще небольшой буферразмер (например, 100 КБ), тогда я все равно получу много файлов.
- Если я буду использовать больший размер буфера (например, 4 МБ), то у меня возникнут проблемы с кучей при сортировке и разбиении результата в памяти из-заограничение.
Каков наилучший подход для меня, чтобы получить наименьшее количество отсортированных файлов (или наибольшие порции данных на файл)?