キーは、値が大きいことを示唆しています (合計で数 GB)。これにより、マップを使用するよりも多くの問題が発生します。
名前がファイル名で、値がファイルの内容であるファイルシステムを使用することをお勧めします。2 つのレベルのディレクトリを使用してファイルを分割し、1 つのディレクトリが大きくなりすぎないようにすることができます。
以下を使用できます。
new File("image_hash.properties").delete(); #a million keys have this prefix
PrintWriter pw = new PrintWriter(new File("image_hash.properties"))
for(int i=0;i<1000*1000;i++)
pw.println(i+"="+true);
pw.close();
効率を重視して true か false しか持てない場合は、バイナリで記述できます。
FileChannel fc = new FileOutputStream("image_hash.flags");
ByteBuffer bb = ByteBuffer.wrap(1000*1000/8); // uses 125KB of memory.
Arrays.fill(bb.array(), (byte) -1);
fc.write(bb);
fc.close();
最初の例では値ごとに最大 14 バイトを使用し、2 番目の例では値ごとに 1/8 バイトを使用しています。