在Java中,有没有办法随机化一个太大的文件以适应内存?

del*_*ber 6 java out-of-memory

我想要做的是将行重新排列(从CSV读取),然后将第一个随机化的10,000行打印到一个csv,将剩余的行打印到单独的csv.使用较小的文件,我可以做类似的事情

java.util.Collections.shuffle(...)
for (int i=0; i < 10000; i++) printcsv(...)
for (int i=10000; i < data.length; i++) printcsv(...)
Run Code Online (Sandbox Code Playgroud)

但是我现在得到了非常大的文件 OutOfMemoryError

Nic*_*tti 1

这是一种可能的算法:

  1. 令 MAX_LINES 为可管理文件中的最大行数;
  2. 从输入文件中读取 MAX_LINES,使用原始算法将它们随机化并将它们写入临时文件;
  3. 重复 2. 直到输入文件中没有剩余行;
  4. 令 N 为 0 和您写入的临时文件数量之间的随机数;从第 N 个临时文件中读取下一行;
  5. 重复4.直到读完所有文件中的所有行;前 10000 次将每一行写入第一个输出文件,将所有其他行写入另一个文件。