将巨大的整数文件(在一行中)分成具有内存限制的已排序块

问题描述 投票:5回答:1

我最近需要将一个行文件(以“,”分隔的整数)排序​​为较小的块,同时考虑到内存限制和效率。我目前正在遵循此逻辑:

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();

假设我被限制为5MB的内存,并且必须读取一个单行文件,该文件的10,000,000整数之间用“,”分隔:]]

  • 如果我使用很小的缓冲区大小(例如10)来读取文件,那么我会创建数千个文件。
  • 如果我使用的是不错的但仍然很小的缓冲区大小(例如100KB),仍然得到很多文件。
  • 如果我使用更大的缓冲区大小(例如4MB),则会有堆由于限制,在内存中对结果进行排序和拆分时出现问题。
  • 对我而言,获取最少数量的已排序文件(或每个文件中最大的数据块)的最佳方法是什么?

我最近需要在考虑内存限制和效率的情况下将一个单行文件(以“,”分隔的整数)排序​​为较小的块。我目前正在遵循此逻辑:File file = new File(“ ...

java file-management
1个回答
0
投票

任务不容易。我敢肯定这不是最好的方法,但是总比没有好:

© www.soinside.com 2019 - 2024. All rights reserved.