从小字节数组创建大数组需要帮助

3

我有如下代码:

    byte[] myBytes = new byte[10 * 10000];
    for (long i = 0; i < 10000; i++)
    {
        byte[] a1 = BitConverter.GetBytes(i);
        byte[] a2 = BitConverter.GetBytes(true);
        byte[] a3 = BitConverter.GetBytes(false);

        byte[] rv = new byte[10];
        System.Buffer.BlockCopy(a1, 0, rv, 0, a1.Length);
        System.Buffer.BlockCopy(a2, 0, rv, a1.Length, a2.Length);
        System.Buffer.BlockCopy(a3, 0, rv, a1.Length + a2.Length, a3.Length);
    }

一切运行正常。我试图将此代码转换为使所有内容都写入“myBytes”,但后来意识到,我使用了一个长整数,如果其值超过了 int.MaxValue,则转换将失败,应该如何解决?

另一个问题是,由于我不想在内存中创建非常大的字节数组,那么如何直接发送到我的.WriteBytes(path,myBytes);函数中呢?

2个回答

2
如果最终目的地是一个文件,建议直接写入文件,而不是在内存中缓冲:
using (var file = File.Create(path)) // or append file FileStream etc
using (var writer = new BinaryWriter(file))
{
    for (long i = 0; i < 10000; i++)
    {
        writer.Write(i);
        writer.Write(true);
        writer.Write(false);
    }
}

也许在您的情况下,最理想的方法是将单个BinaryWriter实例传递给每个对象,以便在序列化它们时使用(不要为每个对象打开和关闭文件)。

“BinaryWriter” 是写入数据的最快方式吗? 在这个例子中,我有10000次迭代,但在实际情况下可能会达到10亿次,这可能需要一些时间。 - Rafael Herscovici
@Demsntic,这使得不尝试将其缓冲到内存中变得更加重要。另外:如果所有这些额外的gen-zero中间数组都没有开销,我不会期望BinaryWriter有开销。所以:是的,它会很快,肯定比在内存中分配一个巨大的数组,然后思考很长时间,然后执行一个巨大的单个IO操作要快。 - Marc Gravell

1
为什么你不直接在处理字节的时候就将它们写出来,而是要转换成一个巨大的缓冲区,或者至少使用一个较小的缓冲区呢?

我的写入函数一次只支持写入一个对象,所以如果我尝试使用.WriteBytes(path, rv),它会在每次循环运行时进行覆盖。 - Rafael Herscovici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接