簡體   English   中英

Memory int 列表大小

[英]Memory size of a list of int

我有一個 int 列表,它以字符串的形式存儲在數據庫中,中間有逗號(4345,324,24,2424,64567,33 ...)。 該字符串可能會變得非常大並包含 2-3 千個數字。 它存儲在數據庫中並經常使用。

我在想,與其每次需要時都從數據庫中讀取它,不如在第一次加載后將其存儲在 session 中。

1,000 個 int 的列表需要多少 memory? memory 大小是否也取決於 int 本身,以便存儲較大的 int (234,332) 比較小的 int (544) 占用更多空間?

以 memory 空間為代價讀取一次並存儲在 session 中會更好,還是在渲染后經常讀取並從 memory 丟棄更好。

感謝您的建議。

我認為你正朝着錯誤的方向前進。 存儲在 DB 中可能是一個更好的選擇,不是以逗號分隔的格式,而是作為一個 int 值表。

在 session 中存儲數據會顯着降低可擴展性。 您可能會開始遇到 OutOfMemory 異常並想知道為什么會發生這種情況。

所以我的建議是在需要時從數據庫中讀取,應用適當的索引,它會非常快。

你前進的方向是:

第 1 天,1 個用戶 - 嗯,我應該將數據存儲在 Session 中,為什么不呢。 應該快速工作。 無需查詢數據庫。 也很容易做到。

第 10 天,5 個用戶 - 需要存儲另一個數據結構,也將其放入 session,為什么不呢? Session 非常快。

第 50 天,10 位用戶 - 有一個需要大量渲染的控件,我會讓它變得智能,渲染一次,然后放到 Session 中,在每次回發時重用它。

第 100 天,20 位用戶 - 有時 web 網站速度很慢,不知道為什么。 但這只是有時,所以沒什么大不了的。

第 150 天,50 個用戶 - 速度變慢了。 需要更好的 CPU 和 memory? 我們需要購買更好的服務器,硬件很舊。

第 160 天,60 位用戶 - 有了新服務器,運行速度更快。 問題解決了。

第 200 天,100 個用戶 - 又變慢了,為什么? 這是最新最貴的服務器!

第 250 天,150 個用戶 - 應用程序池一直在回收。 為什么? 內存不足異常? 這是什么? 我會谷歌。

第 300 天,200 個用戶——用戶抱怨,我們失去了客戶。 我閱讀了有關 WinDbg 的信息,需要嘗試使用它。

第 350 天,200 個用戶 - 我們應該開始使用網絡負載平衡,我們可以購買兩台服務器,購買服務器,嘗試使用,但沒有成功。 對 Session 有很多依賴。

第 400 天,200 個用戶 - 無法獲得新客戶,老客戶 go 離開。 開始使用 WinDbg 發現幾乎所有的 memory 都被 Session 使用。

第 450 天,200 名用戶 - 開始一個名為“擺脫會話”的大項目。

第 500 天,250 名用戶 - 服務器現在非常快。

我去過那里看到。 基本上我的建議 - 不要 go 這種方式。

C# 中的 int 始終為 4 個字節(無論值如何)。 因此,1,000 個整數的列表約為 4,000 個字節。 我說大概是因為列表結構會增加一些開銷。 列表中的幾千個整數對於現代計算機來說應該不是問題。

我不建議將其存儲在 session 中,因為這會導致 memory 壓力。 如果您有一系列與單個記錄相關聯的整數,聽起來您缺少多對一關系 - 為什么不將整數存儲在具有原始表外鍵的單獨表中?

整數在 .NET 中具有固定大小。 假設您將它存儲在一個數組而不是列表中(因為您可能沒有添加或刪除它),它將占用大約 32 位 * 元素的數量。 數組中的 1000 個整數 = 大約 32000 位,或略低於 4 KB。

一個int通常占用 32 位(4 個字節),因此其中 1000 個占用大約 4KB。

數字有多大並不重要。 它們總是存儲在同一個空間中。

這個 int 列表是 session 獨有的嗎? 如果沒有,請將其緩存在服務器級別並為其設置過期時間。 1份清單。

context.Cache.Add(...

我這樣做並每 5 分鍾用大量數據刷新一次。 這種方式非常“新鮮”,但只有 1 個連接會受到影響來填充它。

暫無
暫無

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

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