1. 程式人生 > >關於記憶體溢位遇到的兩種情況

關於記憶體溢位遇到的兩種情況

1.處理資料的程式或者服務是x86架構的,容易出現記憶體溢位。

因為x86的程序,最多允許記憶體4g、在這4g中又有2g是作業系統等、所以當你查詢的資料量非常大的時候,非常容易記憶體溢位。

2.多執行緒 容易導致記憶體溢位(溢位原理細節我還不清楚)

我查詢mongo資料量,資料按地區分類,我查到A地區有70000條資料,B地區有60000條資料。我要將兩地資料匯出成excel,A地匯出成功、B地匯出報錯:記憶體溢位。

為什麼會出現這個異常呢?

這是因為在MongoDB中B地資料的欄位比A地多很多。MongoDB對於.net的這個版本的驅動的find方法 底層用的是Dictionary 的Add來獲取滿足條件的資料集合。但是Dictionary是.net中執行緒不安全的,MongoDB的驅動可能使用了多執行緒查詢資料、把資料插入集合中,由於B地區的資料一行特別長,插入還沒結束,執行緒跑去插另外一條資料去了,這導致集合內部的一個計數器計算錯誤,記的數少了,但是插入的這個行數是不會變的,導致行數超越了集合邊界,於是報記憶體溢位。

參考文獻:https://blog.csdn.net/liweiblog/article/details/52329740