簡體   English   中英

如何減少Winform應用程序的內存消耗

[英]How to reduce memory consumption of my winform application

背景

我有一個需要增強性能的WinForm應用程序。 我寫了大量的文件(大約200-500kbs),這些文件是使用常規File.probuff序列化並寫入的。這些文件的IO總大小超過3Gb(數量約為10,000)。 現在,以5分鍾和7分鍾的周期頻率,我一個接一個地讀取了一半文件,然后合並數據,然后再次對其進行序列化。 眾所周知,該過程在上述頻率下消耗大量的Ram。

我嘗試過的

我找到了有關使用Memory Mapped File的解決方案,並獲得了以下test代碼

寫作

byte[] Buffer = GZipCompressor.ConvertToByteStream<OHLCData>(sampleObj);
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", s.Length + 25))
{
    MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
    accessor.Write(54, (ushort)Buffer.Length);
    accessor.WriteArray(54 + 2, Buffer, 0, Buffer.Length);
    Console.WriteLine(proc.PrivateMemorySize64 / 1024);
}

using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", s.Length + 25))
{
   MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
   ushort Size = accessor.ReadUInt16(54);
   byte[] buffer = new byte[Size];
   accessor.ReadArray(54 + 2, buffer, 0, buffer.Length);
   Console.WriteLine(proc.PrivateMemorySize64 / 1024);
}
//then I convert the buffer back to class..

現在,使用上面的代碼,我無法實現我所尋求的性能改進,我的Ram使用率大約為。 與先前相同(或至少與預期不同)。

我還有另一個想法,可以使用Zip-Archive創建文件組的zip並將其分配給MMF

我的問題:

  • 我上面的方法中的任何一種是正確的嗎,或者我可以針對此內存問題有其他解決方案嗎?

注意:按照我的代碼結構,為數據創建字典並存儲該字典不可行。

編輯:-請注意,在上面的示例中,我不僅僅是將數據附加到末尾,我還必須對先前的數據進行更改,例如從開始刪除不贊成使用的數據表單。

任務的示例表示。

文件存儲:

1,1
2,1 
3,1
4,1

要合並的數據:

3,2
5,2

最終輸出:

 2,1
 3,3
 4,1
 5,2

請注意,在以上示例中,已棄用的1,1被刪除,而3,1被更新為3,3,而5,2是新元素

嗨,通過閱讀您的帖子,我有些困惑。

您正在獲取要序列化並存儲到磁盤的數據。 這將產生以下問題,您必須再次加載數據,這是一個緩沖區,然后分配或使用第二個緩沖區進行反序列化。 如果將數據保存為非序列化狀態會怎樣?

我感到困惑的第二件事是您是否合並了以前合並的文件? 例如,您獲得文件foo1和foo2並將其合並到文件foo12中,在某個時間點之后,您將獲得第三個文件foo3並將其合並到文件foo12中? 無論如何,您都會消耗大量內存。 檢查您的數據是否可以進行位打包或查看不需要的數據類型,例如將int還原為uint_8或使用其他內容。

如果使用protobuf僅序列化壓縮數據,則不是一個好主意。 有一些壓縮算法可以做得更好並且非常快。 您是否綁定到protobuf?

還有一個問題是為什么您的數據不是最少的。 例如:

1,4
2,4
3,4
4,4

可能:

T 4
1
2
3
4

這樣一來,您需要處理的信息就更少了。 是的,您必須跟蹤其他內容,但是沒有什么是完美的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM