问题

我最近需要将一个行文件(由“,”分隔的整数)排序为内存限制和效率较小的块.我目前正在遵循这个逻辑:

 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),我会有堆 由于限制,排序和分割结果会导致内存时出现问题。

获取最少排序文件(或每个文件可能的最大数据块)的最佳方法是什么?

  最佳答案

任务不是一个简单的任务.我确信这不是最好的方法,但比没有更好:

  1. 找到或创建一个list,如PriorityQueuesizecomparator构造函数args.大小应该已知(根据您的要求) 2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 方法add(..)应匹配O(log n)并在插入它们时对项目进行排序 方法add(..)在完全填充列表时应返回false(否则true) 2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表
  2. 执行流读取并立即(不缓冲)向集合添加整数.如果没有免费空间,则创建一个新列表.
  3. 现在您有一组排序列表.最后一步是通过列表对数据进行排序: [1,4,5],[3,8,9],[2,6,7] – > [1,2,3], [4,5,6], [7,8,9] 例如,通过从列表#1和列表#2中选择最小值,比较它们,等等。

注意:还可以同时执行步骤#3

大约#2: 我错过了你有string-data.所以将字节序列解析为整数是不好的想法.但是,应该可以解析数据char-by-char,然后在逗号出现时转换为int.此外,可以计算缓冲区大小(每符号最大数字长度*字节) – >对于UTF-8中的2147483647,它是11 * 1.

  相同标签的其他问题

javafile-management