在C#中将巨型布尔数组保存/加载到磁盘?

时间:2017-03-09 14:01:24

标签: c# .net

我有10亿个体素的体素文件,每个体素都是真/假,并保存在一维布尔数组中。

将它复制到磁盘的好方法是什么,例如作为bytes / a 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

1 个答案:

答案 0 :(得分:5)

在.NET中,布尔运算符的大小并不大,因此它们不是您想要的数据类型的良好存储空间。相反,使用BitArray - 它仍然为您提供所需的所有操作(读取单个位值,写入单个位值),并允许您在byte[]中加载和存储整个数组(每字节最多8位)。这使得持久性非常简单:

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

当然,这实际上是多么有效率取决于分析。除非实际需要,否则您可能不想加载数据,因此某种寻呼解决方案可能会更好;但这超出了你的问题的范围。