簡體   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