[英]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.