2017-03-09 52 views
1

我有10億個體素的體素文件,每個體素都是真/假,並保存在一維布爾數組中。在C#中保存/加載巨型布爾數組到磁盤?

什麼是將其複製到磁盤的好方法,例如字節/ 0100010101 ASCII文件,我可以快速高效地將文件讀回到內存中?

此刻,我可以用文件寫入到磁盤:

savePath = System.IO.Directory.GetParent(Application.dataPath).ToString()+ "/Saved_Files" ; 
var sw : System.IO.StreamWriter; 

我不知道讀寫1-2GB文件的最好方法。

這是我寫的那一刻:

function saveBW(){ 
    //var SW2 : System.IO.StreamWriter; 
    var timeString = DateTime.Now.ToString("HH-mm"); 
    var fileNameFromFolder= Path.GetFileNameWithoutExtension(QPath[QDone]); 
    fileNameFromFolder = stripTrailingSlash(fileNameFromFolder); 

    PLYname = "MK5_aliased_" + fileNameFromFolder + "_"+ timeString + ".Bo0L" ; 
    var str =""; 
    var SW2 = new System.IO.StreamWriter(savePath + "/" + PLYname); 

    for(var tr = 0 ; tr < mesher.supernormous.Length ; tr++) 
    { 
     str += mesher.supernormous ? 1 : 0; 
     if(tr%255==0)SW2.Write(str); 
    } 

    SW2.Write(str); 
    SW2.Flush(); 
    SW2.Close(); 
} 

enter image description here

+2

您可以將8位組合在一起,並將它們寫爲字節 –

+0

我對如何編寫最簡單的解析器和分段讀取以找到我在讀取過程中的位置感到困惑。 –

+3

不要重新發明輪子。 https://msdn.microsoft.com/en-us/library/system.io.binarywriter(v=vs.110).aspx –

回答

5

布爾不是.NET位大小,所以他們不是那種數據的良好存儲你想。相反,使用BitArray - 它仍然給你所有你需要的操作(讀取一個單一的值,寫入一個單一的值),並允許你加載和存儲整個數組在byte[](每個字節最多8位)。這使得持久性非常容易:

var data = new BitArray(File.ReadAllBytes("MyFile.bin")); 

當然,這個效率到底是多高效的就是分析。這可能是因爲除非實際需要數據,否則不需要加載數據,因此某種分頁解決方案可能會更好;但這超出了你的問題的範圍。

+0

我有無限的文件空間,並且我必須對每個布爾值執行大約100次讀取操作,存儲在8位內存中,讀取速度比位快,是否可以輕鬆地將位和布爾轉換爲加載/保存?我不是一個程序員,我是一名工程師,我在家裏學習編程。 –

+1

@comprehensible當然, 'BitArray'也有一個構造函數,它使用'bool []',而'CopyTo'方法同時使用'bool []'和'byte []'。如果你的方案中的開銷很大,那麼手動讀取和寫入字節可能是值得的 - 它確實不難,只需要簡單的數學計算和正確的邊界案例。將它看作一個鋸齒形數組,其中每個「byte」對應一個帶有8個元素的「bool []」,並且訪問該字節中的一個元素爲'byteVal&(2 << index) > 0'(read)and'byteVal | =(2 << index)*(boolVal?1:0)'(寫 - 只在不重用字節的情況下有效) – Luaan

+2

@comprehensible這允許您在保留內存表示的同時保持較小的文件快速。雖然我仍然會描述這個事情,並確保它實際上值得讓它們保留在'bool []'中 - 假設不是現在決定的好方法:)操作bool可以更快/更便宜,但是與此同時,您現在需要8 GiB的內存而不是1 GiB;像這樣的事情通常由內存訪問模式決定,這對於正確分析來說非常棘手。訪問是隨機的還是順序的?有沒有比一維數組更好的組織,例如空間細分? – Luaan