如何在C#中非常快速地将一个doubles数组写入一个文件

本文关键字:一个 数组 文件 doubles 非常 | 更新日期: 2023-09-27 18:23:44

我想在文件中写这样的东西:

FileStream output = new FileStream("test.bin", FileMode.Create, FileAccess.ReadWrite);
BinaryWriter binWtr = new BinaryWriter(output);
double [] a = new double [1000000];  //this array fill complete
for(int i = 0; i < 1000000; i++)
{
    binWtr.Write(a[i]);
}

不幸的是,这个代码的过程持续了很长时间!(在这个例子中大约10秒!)

文件格式为二进制。

我怎样才能更快?

如何在C#中非常快速地将一个doubles数组写入一个文件

您应该能够通过将doubles数组转换为字节数组来加快进程,然后一次性写入字节。

这个答案显示了如何进行转换(下面的代码来自这个答案):

static byte[] GetBytes(double[] values) {
    var result = new byte[values.Length * sizeof(double)];
    Buffer.BlockCopy(values, 0, result, 0, result.Length);
    return result;
}

有了字节数组,您可以调用Write,它采用字节数组:

var byteBuf = GetBytes(a);
binWtr.Write(byteBuf);

您正在以1乘1的方式写入字节,当然这会很慢。

您可以在内存中写入一个数组,然后一次将数组写入磁盘,如下所示:

var arr = new double[1000000];
using(var strm = new MemoryStream())
using (var bw = new BinaryWriter(strm)) 
{ 
    foreach(var d in arr)
    {
        bw.Write(d);
    }
    bw.Flush();
    File.WriteAllBytes("myfile.bytes",strm.ToArray());
}