2017-03-09 10 views
1

私は10億ボクセルのボクセルファイルを持っています。すべてのボクセルは真/偽であり、1Dブール値配列に保持されています。C#で巨大ブール配列をディスクに保存/ロードしていますか?

バイト/ 0100010101 ASCIIファイルなど、ディスクにコピーするのによい方法は、ファイルをメモリに高速かつ効率的に読み込むことができる点です。私は1〜2ギガバイトのファイルを読み書きするための最良の方法を知らない

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

:私が使用してディスクにファイルを書き込むことができます現時点では

これは私が一瞬のために書いたものです:

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ビットをグループ化してBytesとして書くことができます –

+0

最も単純なパーサーを書く方法と読み込みを分割する方法について、私は混乱しています。 –

+3

ホイールを改造しないでください。 https://msdn.microsoft.com/en-us/library/system.io.binarywriter(v=vs.110).aspx –

答えて

5

ブール値は、.NETでビットサイズではありませんので、彼らはデータの種類あなたのために良いのストレージではありません欲しいです。代わりに、BitArrayを使用してください。これにより、必要な操作(単一のビット値を読み、単一のビット値を書き込む)が得られ、配列全体をロードしてbyte[](1バイトあたり最大8ビット)に格納することができます。これにより、永続性が非常に簡単になります。

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

もちろん、これは実際には効率的です。実際に必要でない限りデータをロードしたくないことがあるかもしれないので、ページングソリューションのほうが良いかもしれません。それはあなたの質問の範囲を超えています。

+0

私は無制限のファイルスペースを持っています。そして、私は約8ビットのメモリに格納されているすべてのブール値に対して約100回の読み取り操作を行う必要があります。ビットより読み込みが速く、セーブ?私はプログラマーではないエンジニア、私は家でプログラミングを学んだ。 –

+1

@comprehensibleもちろん、 'BitArray'には' bool [] 'を使うコンストラクタもあり、' CopyTo'メソッドは 'bool []'と 'byte []'の両方で動作します。あなたのシナリオではオーバーヘッドが重要な場合は、手動でバイトを読み書きする価値があります。実際には難しくなく、単純な数学でエッジケースを正しく取得できます。各バイトは8要素の 'bool []'に対応し、バイト内の要素へのアクセスは 'byteVal&(2 << index) > 0'(read)と' byteVal | – Luaan

+2

@comprehensibleこれにより、ファイルを小さく保つことができ、メモリ内の表現を持たせることができるようになりました。(boolVal?1:0)速い。私はまだ物事をプロファイリングし、ビットを 'bool []'に入れる価値があることを確かめていますが、前提を判断する良い方法はありません:)ブールを操作する方が速く/安くなりますが同時に、1 GiBの代わりに8 GiBのメモリが必要になります。このようなことはしばしばメモリアクセスパターンによって決定されますが、これは適切に分析するのは非常に難しいことです。アクセスはランダムかシーケンシャルですか? 1D配列よりも優れた組織があるかどうか。空間的細分? – Luaan

関連する問題