none
System.OutOfMemoryException 的相關問題 RRS feed

  • 問題

  • System.OutOfMemoryException 相信大家都不陌生
    大部分引起的情況再於程式中編寫錯誤.導致程式不斷的消耗記憶體導致發生錯誤

    但是我的情況在於我真的就是需要將這麼大量的資料一次載入做處理與分析.
    若是將資料分批載入會讓程式花的時間過久.

    我用的語言是C# 
    儲存資料的方式是arraylist
    大概當我在之中存了約 1500萬句字串時會出錯.

    請問在C#環境中我該怎麼擴增系統配置的記憶體?

    我的電腦記憶體有4G.系統應該是把預設配給它的記憶體用光才會發生這樣的錯誤吧?
    請問有辦法增加嗎?

    2010年3月8日 下午 12:31

解答

  • ETL : 你可將資料庫或資料表視為一個點, 點與點之間的傳輸及轉換即是ETL工具, 一般DataBase 都會有ETL工具 如SQL Server: SSIS or DTS
    BI : 你可將它視為分析用的工具 它包含了商業邏輯,呈現,報表,多維度... 像Excel 也可是一個微型的工具 另外Crystal report, SAP ... 也都是
    當然以你的需求應該用不到BI.
    你的需求若我來設計
    1. 想辦法Bulk insert or fast load to DB
    2. 用SQL 的語法來Extract 出index table
    3. 其它應用程式直接查詢index table

    只要是大量的資料處理不會想用程式硬Co , 會利用資料庫的功能來處理 , 畢竟那是資料庫本身的強項


    2010年3月9日 上午 05:13

所有回覆

  • 2010年3月8日 下午 12:55
  • MSDN的方法是要我不要用這麼多記憶體..
    但是我不是不小心消耗這麼多記憶體而是必須...所以不適用
    2010年3月8日 下午 01:25
  • 我想你應該是x32的OS吧
    32位元預設單一應用程式只可使用2G記憶體
    透過下面方法最多可設為3G
    http://support.microsoft.com/default.aspx?scid=kb;en-us;820108
    2010年3月8日 下午 01:31
  • 我想知道你 "必須" 的理由是什麼。
    還是你就只是不想做 disk I/O?
    是否能完全不做 disk I/O,不是你能決定的。

    就算是 4G,作業系統多少也會使用 Virtual Memory (硬碟) 來當記憶體用,況且作業系統自己也要用記憶體,哪有可能讓你全部吃光?
    以下為簽名檔,請勿對話入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年3月8日 下午 01:46
    版主
  • 一次載入記憶體還不是要分批給 CPU 處理...
    如果一直硬要一次載入,那以前的人不就不用寫程式了?
    修改你的演算法跟邏輯吧~


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月8日 下午 03:41
  • hi
    增加應用程式記憶體大小應該只能治標不能治本,在X86下要增加應用程式記憶體上限可設定/3gb來達到。

    How to Set the /3GB Startup Switch in Windows
    http://technet.microsoft.com/en-us/library/bb124810(EXCHG.65).aspx

    http://www.dotblogs.com.tw/ricochen/Default.aspx
    2010年3月8日 下午 11:44
  • 大量的資料一次載入做處理與分析 --> 直覺就會用ETL + BI 工具來處理吔
    如:
    (1) ETL to DB
    (2) 滾出Cube
    (3) BI工具來做多維度

    2010年3月9日 上午 01:32
  • 回覆小朱版主那篇:

    好的..那我試著解釋我為何必須的理由

    我的程式主要在於搜尋.比對.跟回傳結果.

    程式會讀入約6000多句的字串.然後要在1701的文檔內(14G)進行搜尋.比對.回傳

    14G非常的大.我不可能全部讓電腦讀入.但又文檔的重複使用率高.第一句句子要使用的文檔很有可能在第2.3.4.5也需要使用

    所以我設立一個ARRAYLIST.讓程式把搜尋目標可能存在的檔案讀入再做搜尋.

    然後這個ARRAYLIST有一個置入置出的機制.這個機制我寫的很簡陋.只是在置入超過N個檔案後自動清空.

    目前我遇到的問題就是ARRAYLIST中放入超過1500萬的句子會導致System.OutOfMemoryException.

    但是1701個文檔中大小有時差非常多.甚至有時光是一個檔就包含約1300萬的句子.

    要是我把ARRAYLIST設定成一次只裝一個文檔.必定會導致文檔重複讀取的發生率過高.執行時間過長.

    所以我現在遇到的問題是

    我的程式已經使用超過2G的記憶體了嗎?若不是,是不是能夠增加配置記憶體來解決問題同時不讓程式執行時間過長?





    2010年3月9日 上午 04:49
  • 回覆心冷熱情熄:

    不一次載入程式還是有執行的方式.不過這樣我認為會大幅拉長程式執行時間而作罷.

    程式詳細的狀況我回覆在小朱MVP版主的那篇.我的功力不夠目前還想不出來能夠兼顧的方法..

    我也不知道程式有2G的記憶體配置上限.而我因為載入1500萬的句子是否已超過..
    2010年3月9日 上午 04:53
  • 大量的資料一次載入做處理與分析 --> 直覺就會用ETL + BI 工具來處理吔
    如:
    (1) ETL to DB
    (2) 滾出Cube
    (3) BI工具來做多維度

    不知道什麼是ETL跟BI..請問是..?
    2010年3月9日 上午 04:58
  • ETL : 你可將資料庫或資料表視為一個點, 點與點之間的傳輸及轉換即是ETL工具, 一般DataBase 都會有ETL工具 如SQL Server: SSIS or DTS
    BI : 你可將它視為分析用的工具 它包含了商業邏輯,呈現,報表,多維度... 像Excel 也可是一個微型的工具 另外Crystal report, SAP ... 也都是
    當然以你的需求應該用不到BI.
    你的需求若我來設計
    1. 想辦法Bulk insert or fast load to DB
    2. 用SQL 的語法來Extract 出index table
    3. 其它應用程式直接查詢index table

    只要是大量的資料處理不會想用程式硬Co , 會利用資料庫的功能來處理 , 畢竟那是資料庫本身的強項


    2010年3月9日 上午 05:13
  • 15 年前就有搜尋引擎,15 年前的硬碟、CPU、RAM 能這樣玩嗎?

    我覺得你應該先去看看 Jounal of ACM 或去全國博碩論文網找搜尋引擎的邏輯與加速方式,而不是硬搞...


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月9日 上午 11:58
  • 我現在也有相當的痛苦。

    必需要在64位元的環境開發32位元的程式,且需要可使用大量的記憶體來比對、產出結果、統計

    方才能滿足業主要求的反應時間

    不知道您的問題是否有解了? 如果有是否能分享解決的經驗

    感謝

    2010年11月22日 下午 02:34