使用記憶體對映檔案MMF實現大資料量匯出時的記憶體優化

2021-10-02 04:33:52 字數 1354 閱讀 8063

我們以單次匯出乙個excel舉例(csv同理),excel包含1~n個sheet,在每個sheet中儲存的按行和列的座標在單元格儲存具體資料,如果我們要使用mmf,第乙個要考慮的就是如何將整個excel合理的儲存到mmf中。這裡我們引入mmf兩個物件:

* 這裡有個需要注意的是mmf不能儲存引用型別,包括字串...,折衷先將string轉為char然後使用writearray方法儲存,考慮到取資料的時候同樣需要使用char陣列,而陣列必須指定長度,我們將陣列長度和具體資料都存起來,這樣取資料時候的索引也可以計算出來了

資料儲存示例:

這面是具體的實現**:

//

新增外部引用防止被自動gc

//////

寫入

/// public

void

writemmf()

", 1024 * 1024 * 1024); //

檔案大小最大為1g

for (var row = 0; row < 10; row++)

行第個單元格~!");

var length =buffer.length;

accessor.write(index, length);

accessor.writearray(index + 4, buffer, 0

, length);

index += (length + 4

); }

}mmfs.add(mmf);}}

//////

讀取

/// public

void

readmmf()

");for (var row = 0; row < 10; row++)}}

mmfs = null

; }

執行效果:

* 這裡有個需要注意的點是,如果不在外部引用mmf,如果建立多個mmf,只有最新乙個能通過openexisting方法開啟,其他的都報system.io.filenotfoundexception,猜測是資源被釋放掉了

* 還有個需要注意的點是,一定要計算好資料體積,不要超過mmf上限,使用accessor的時候也要注意,資料量實在太大可以考慮將乙個sheet拆成多個mmf,或者將一行資料拆成多個accessor

這樣就可以實現從資料庫獲然後處理再儲存到載體的流程,整個過程中記憶體使用控制在乙個比較低的水平,當然,這是使用時間換空間,相應的匯出時間會延長

順便說一下,原本考慮後續使用epplus進行excel生成,後來發現npoi也和poi一樣有sxssfworkbook物件,可以流式讀取資料,配合記憶體對映檔案可以實現整個匯出過程

使用記憶體檔案對映實現共享記憶體

不使用ipc中的共享記憶體 shm 使用記憶體檔案對映的方式來實現共享記憶體 共享記憶體寫入者 使用檔案記憶體對映進行記憶體共享 include include include include include include include include include include using...

記憶體對映檔案實現共享記憶體

記憶體對映檔案程序間共享記憶體 記憶體對映檔案的另乙個功能是在程序間共享資料,它提供了不同程序共享記憶體的乙個有效 且簡單的方法。後面的許多例子都要用到共享記憶體。共享記憶體主要是通過對映機制實現的。windows 下程序的位址空間在邏輯上是相互隔離的,但在物理上卻是重疊的。所謂的重 對映檔案物件時...

使用windows記憶體 記憶體對映檔案

和虛擬記憶體一樣,記憶體對映檔案可以用來保留乙個程序位址區域 但是,與虛擬記憶體不同,它提交的不是物理記憶體或是虛擬頁檔案,而是硬碟上的檔案。將檔案對映成記憶體,我們可以像使用內 存一樣使用檔案.使用場合 它有三個主要用途 系統載入exe和dll檔案 作業系統就是用它來載入exe和dll檔案建立程序...