簡體   English   中英

C#使用大型多維(非鋸齒狀)字節數組進行文件I / O的簡單方法

[英]C# simple way to do file I/O with big multidimensional (non-jagged) array of bytes

我正在使用大型多維字節數組(每個數組大約500mb,比如一個維度為[8,8192,8192]的數組),我想將它們讀入並寫入文件進行存儲。

我嘗試使用BinaryFormatter,但速度很慢(需要幾分鍾才能完成)。

我嘗試使用BinaryWriter,但它只需要一個單維數組。 現在,在C中,將多維數組作為單維傳遞沒有問題。 在C#中,從我看到的,我有兩個選擇:

  • 為一維數組分配另一塊內存,用for循環將數據復制到其中,然后使用BinaryWriter將此數組寫入文件
  • 使用for循環,使用BinaryWriter將每個字節寫入文件

顯然,如果我只使用byte []到處而不是使用myarray [i,j]使用myarray [i + j * myarray_width]會更快,但這需要重寫整個類只是為了更容易的工作一組I / O功能(保存/加載)。

必須有一個更好的方法。

在快速序列化方面,不安全的代碼可能派上用場。 有兩種技術可以幫到這里:

  1. 從你的byte[,]到你可以傳遞給FileStream.Write的新byte[]做一個memcpy。 當然,這需要臨時加倍存儲空間和一些復制。 但是,您可以將此工作拆分為64KB塊。
  2. PInvoke到非托管WriteFile並傳遞FileStream.SafeHandle值。 WriteFile采用任意指針,因此您可以直接寫出您的byte[,] (轉換為void* )。

選項2最快(“零復制”)。

旁注:每當您需要重新解釋字節時,不安全的代碼就派上用場了。 這種能力導致C中的一些很好的抽象。幸運的是,C#也有這種能力。

暫無
暫無

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

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