日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

磁盘支持的阵列列表

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 磁盘支持的阵列列表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時,您的列表可能會變得太大而無法容納在內存中,因此您必須采取一些措施以避免內存不足。

做到這一點的正確方法是流傳輸–而不是將所有內容都放入內存中,您應該從源流傳輸數據并丟棄已經處理的條目。

但是,在某些情況下,您無法控制的代碼需要一個List而您不能使用流式傳輸。 這些情況很少見,但萬一擊中它們,您必須找到解決方法。 一種是重新實現代碼以與流一起使用,但是根據編寫庫的方式,可能無法實現。 因此,另一種選擇是使用磁盤支持的列表–一個用作列表的列表,但在其下方存儲和加載磁盤中的元素。

搜索現有的解決方案會產生3年以上的倉庫,例如這個 , 這個和這個 。

然后是MapDB ,它很棒并且受支持。 它主要是關于地圖的,但是它也支持List,如此處所示 。

最后,如果您只需要迭代而幾乎不需要別的,則可以選擇自己實現一些簡單的事情。 我在這里做了– DiskBackedArrayList.java 。 它不支持很多東西(并非所有方法都被重寫以引發異常,但是應該)。 但最重要的是,它不支持隨機添加和隨機獲取,也不支持toArray()。 它純粹是“填充收藏集”,然后“迭代收藏集”。 它依賴于ObjectOutputStream ,效率不是很高,但是易于使用。 請注意,在需要將少量數據添加到列表的情況下,我允許使用較短的內存prependList。

該列表將填充到內存中,直到達到指定的閾值,然后刷新到磁盤,清除內存,內存又開始被填充。 這也可能會更有效–在另一個線程中進行后臺刷新,這不會干擾將元素添加到列表中,但是優化使事情變得復雜,在這種情況下,總運行時間不是問題。 最重要的是,重寫iterator()方法以返回一個自定義迭代器,該迭代器首先流式傳輸前置列表,然后從磁盤讀取所有內容,最后遍歷仍在內存中的最新批處理。 最后,最后應調用clear()方法以關閉基礎流。 可以在每次刷新時打開和關閉輸出流,但是由于某些特定于首先寫入標頭的實現,因此不能在附加模式下使用ObjectOutputStream 。

因此,基本上,我們將流方法隱藏在List接口的下面–它仍在流元素并在不需要時將其丟棄。 理想情況下,應在數據源(例如數據庫,消息隊列等)上完成此操作,而不是將磁盤用作溢出空間,但是在某些情況下,使用磁盤很好。 此實現是一個起點,因為尚未在生產中進行測試,但是說明您可以根據需要使現有類適應不同的數據訪問模式。

翻譯自: https://www.javacodegeeks.com/2019/12/a-disk-backed-arraylist.html

總結

以上是生活随笔為你收集整理的磁盘支持的阵列列表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。