繁体   English   中英

是否可以将大型结构数组直接写入 c# 中的二进制文件?

[英]Is it possible to write a large array of struct directly to a binary file in c#?

我知道在 SO 上有很多类似的问题。 但他们都没有我想要的答案。

我需要将一个非常大的数组(大约 1 GiB 的存储空间)写入一个二进制文件。 它由非常简单的结构组成(结构只有 4 个只读字节成员)。

我可以在一个 go 中将该数组写入二进制文件/流而不将整个数组复制到字节数组中吗? 我绑定到 .NET 标准 2.0,所以没有 MemoryMarshal 的帮助。

干杯,乔治

这对你有帮助吗? 按指针复制

public static byte[] GetBytes<T>(T[] structAry) where T : struct
    {
        int len = (int)structAry.Length;
        int size = Marshal.SizeOf(default(T));
        byte[] arr = new byte[size * len];

        IntPtr ptr = Marshal.AllocHGlobal(size);
        try
        {
            for (int i = 0; i < len; ++i)
            {
                Marshal.StructureToPtr(structAry[i], ptr, true);
                Marshal.Copy(ptr, arr, i * size, size);
            }
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            Marshal.FreeHGlobal(ptr);
        }
        return arr;
    }

这取决于您的情况,我将概述一些情况,以便您选择最适合您情况的情况。

您的阵列已经在 memory

您无需将其复制到另一个数组中,您将能够将其写出。

您有一个文件,其中包含要保存到另一个文件中的内容

您可以使用 [File.Copy][1] 来复制文件。

不能直接复制数据

如果您的数据要从远程源中提取,或者您的数据由于某种原因需要在保存之前进行解析/修改,那么您需要将其加载到 memory 中,这是没有办法的。 但是,您可以使用以下算法加载较小的数据包,而不是一次加载整个数据包

while (packet <- packets.Next) do
    initialize(packet)
    save(packet)
    finalize(packet)
while end

在此处查看更多信息: https://social.msdn.microsoft.com/Forums/vstudio/en-US/54eb346f-f979-49fb-aa2d-44dddad066bd/how-to-read-file-in-chunks-with-for- loop?forum=netfxbcl [1]: https://docs.microsoft.com/en-us/dotnet/api/system.io.file.copy?view=net-5.0

我不知道一种指向 memory 块的方法,您可以在不复制数据的情况下将其与File.Write...一起使用。

我建议分块写:

  1. 将零件复制到缓冲区
  2. 将缓冲区写入文件
  3. 复制下一个块
  4. 将缓冲区写入文件
  5. 重复直到整个 object 完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM