मैं एक आंतरिक वर्ग का उपयोग कर रहा हूं जो हैश मैप का उप-वर्ग है। मेरे पास String
कुंजी और double[]
मान के रूप में है। मैं double[]
प्रति 200 युगल स्टोर करता हूं। मुझे कुंजी, पॉइंटर्स और युगल स्टोर करने के लिए लगभग 700 एमबी का उपयोग करना चाहिए। हालांकि, स्मृति विश्लेषण से पता चलता है कि मुझे उससे अधिक की आवश्यकता है (थोड़ा 2 जीबी)।जावा में Serializable, क्लोनेबल और मेमोरी उपयोग
TIJmp (प्रोफाइलिंग टूल) का उपयोग करके मैंने देखा कि char[]
था जो कुल स्मृति का लगभग आधा उपयोग कर रहा था। टीआईजेएम ने कहा कि char[]
Serializable
और Cloneable
से आया था। इसमें मान फोंट की सूची और संदेशों और एकल वर्णों के डिफ़ॉल्ट पथ से लेकर थे।
JVM में Serializable
का सटीक व्यवहार क्या है? क्या यह हर समय "लगातार" प्रतिलिपि रखते हुए, मेरी स्मृति पदचिह्न के आकार को दोगुना कर रहा है? मैं जेवीएम को मेमोरी होग में घुमाने के बिना रनटाइम पर ऑब्जेक्ट की द्विआधारी प्रतियां कैसे लिख सकता हूं?
पीएस: विधि जहां मेमोरी खपत सबसे अधिक बढ़ जाती है वह नीचे दी गई है। फ़ाइल में लगभग 22 9, 000 लाइनें और प्रति पंक्ति 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");
}
ओह !, और 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;
}
}
क्या आप कुछ कोड नमूने दिखा सकते हैं? – axtavt
कृपया उन परीक्षणों को पोस्ट करें जो दिखाते हैं कि सीरियलज़ेबल मेमोरी पदचिह्न बढ़ाता है। यदि आप कोड पोस्ट कर सकते हैं जो आपके मानचित्र <स्ट्रिंग, डबल []> का उपयोग कर रहा है तो इससे भी मदद मिलेगी। –
मुझे देखने दो कि क्या मैं वहां आपका बयान समझता हूं। आप कह रहे हैं कि एक धारा Serializable घोषित करके आकार के उदाहरणों पर कब्जा आकार यह क्षणिक से बड़ा है? –