HashMapのサブクラスである内部クラスを使用しています。私はString
キーとdouble[]
値としてを持っています。1つあたり約200のダブルを保存しdouble[]
ます。キー、ポインター、およびダブルを格納するために約700MBを使用する必要があります。ただし、メモリ分析では、それよりもはるかに多く(2 GB強)が必要であることがわかりました。
TIJmp (プロファイリングツール)を使用すると、メモリ全体のほぼ半分を使用していることがわかりました。char[]
TIJmpはそれがとchar[]
から来たSerializable
と言ったCloneable
。その中の値は、フォントとデフォルトのパスのリストからメッセージと単一の文字までの範囲でした。
Serializable
JVMでの正確な動作は何ですか?したがって、常に「永続的な」コピーを保持し、メモリフットプリントのサイズを2倍にしますか?JVMをメモリを大量に消費することなく、実行時にオブジェクトのバイナリコピーを書き込むにはどうすればよいですか?
PS:メモリ消費量が最も増える方法は以下のとおりです。このファイルには、約229,000行と1行あたり202フィールドがあります。
public void readThetas(String filename) throws Exception
{
long t1 = System.currentTimeMillis();
documents = new HashMapX<String,double[]>(); //Document names to indices.
Scanner s = new Scanner(new File(filename));
int docIndex = 0;
if (s.hasNextLine())
System.out.println(s.nextLine()); // Consume useless first line :)
while(s.hasNextLine())
{
String[] fields = s.nextLine().split("\\s+");
String docName = fields[1];
numTopics = fields.length/2-1;
double[] thetas = new double[numTopics];
for (int i=2;i<numTopics;i=i+2)
thetas[Integer.valueOf(fields[i].trim())] = Double.valueOf(fields[i+1].trim());
documents.put(docName,thetas);
docIndex++;
if (docIndex%10000==0)
System.out.print("*"); //progress bar ;)
}
s.close();
long t2 = System.currentTimeMillis();
System.out.println("\nRead file in "+ (t2-t1) +" ms");
}
Oh !、そしてHashMapXは次のように宣言された内部クラスです:
public static class HashMapX< K, V> extends HashMap<K,V> {
public V get(Object key, V altVal) {
if (this.containsKey(key))
return this.get(key);
else
return altVal;
}
}