簡體   English   中英

如何在 Java 中創建內存高效的數據結構

[英]How to create memory efficient data structures in Java

如果我理解正確的話,Java 會為每個類創建一些開銷。 如果我想創建典型的數據結構,例如鏈表、樹、嘗試等,單個(列表)項將是類,因此與 C 中的類似數據結構相比,這會產生顯着的開銷。這對於非常大的數據結構來說尤其困難數據集。 有沒有更好的方法在 Java 中實現這些類型的數據結構,這樣我就不會產生與在內存中存儲類相關的開銷?

這里描述了Java對象的內存消耗 如果我有數百萬個對象,使用對象的開銷可能會變得太昂貴。 所以我想知道是否有更好的方法來處理這種情況。

您可以在字節塊上實現這些集合(作為new byte[...]ByteBuffer .allocate allocate[Direct](...)unsafe allocateMemory(...) )。 然后,您可以手動管理此內存:包/解壓縮你的對象,並從字節塊額外數據一起(類似的指標leftright的二叉樹值,指數next一個鏈表等),這樣你就不會必須在對象頭、額外引用、對齊上花費內存(盡管您可能決定確實需要引入自己的對齊); 可以讓你的對象脫離堆; 可以將它們映射到文件系統以實現持久性等。但是,這並不簡單並且會產生微妙的影響(例如,您可能開始依賴於malloc實現並失去 JVM 堆優化;失去內存模型保證;您的對象可能會在緩存行之間拆分;您將失去 GC 壓縮等的好處)。 我並不是說其中任何一個都是表演者,只是不是所有的玫瑰,你應該明白你到底得到了什么。 如果您有數百萬個對象,那么開銷很可能以 100 兆字節為單位。 確保嘗試保存它們是值得的(與需要多少必要數據 + 與您的堆有多大相比)。

您始終可以使用 Java ( JNI ) 中的 c++ 本機代碼來提高性能和控制級別(我認為您並不真正需要它,而且我不確定您是否可以超越標准的 Java 代碼)。

在 Google 上快速搜索“c++ library jni”,找到了這篇題為Wrapping a C++ library with JNI – Introduction這可能很有趣的文章。 我沒有讀過,所以我對內容不做任何推薦或保證。

如果您有數據集,其中 java 的對象大小開銷是一個實際問題,我建議考慮使用數據庫。 您可以從內存中的嵌入式數據庫開始,例如 sqlite、h2 或 redis。

隨着您的數據越來越大,您將需要更復雜的管理。 手動更新交叉引用、索引等以確保可以有效查詢您的數據是數據庫可以提供幫助的巨大努力。

使用合適的數據庫還可以讓您在數據開始達到數百 GB 級別時不再適合內存時,以及當您必須過渡到實際開始使用磁盤時,甚至在達到數 TB 時進一步增加數據大小當您必須使用多台機器來保存數據而無需進行重大重寫時的級別。

一個合適的數據庫可以與您的應用程序一起增長,而內存中的一堆對象則不能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM