重慶分公司,新征程啟航
為企業(yè)提供網站建設、域名注冊、服務器等服務
為企業(yè)提供網站建設、域名注冊、服務器等服務
一、問題來源
1.1問題現(xiàn)象
動態(tài)多字段導出內存溢出
1.2問題分析
從問題的現(xiàn)象中找不到問題出現(xiàn)根源,需要通過捕獲異常來分析問題具體出在那
通過不同參數(shù)導出測試,發(fā)現(xiàn)30個以內的列名導出沒有問題,超過其上限在datatable給控鍵(原來用aspose控件)賦值中就拋出了異常。當初以為是控件問題,就嘗試用NOPI控件,但是問題依然存在。由此可見內存溢出很大原因是來自要到導出的列名太多(73個字段),讀取datatable的值時導致了內存溢出,需要用另一種方式來替換通過讀取datatable賦值的方式來實現(xiàn)給導出控件賦值。
二、解決方法
找到了導致問題出現(xiàn)的大可能,接下來就是如何去解決。如果每次都是全部導出,這個問題好解決,直接通過foreach逐行讀取對象集合給控件賦值就ok了,問題是需要按照客戶選定的列名動態(tài)導出,找出需要導出的字段與其對象屬性的對應關系是解決問題的關鍵所在。當時嘗試用了通過xml配置文件找到它們對應關系,但并未能實現(xiàn),原因是動態(tài)控制難實現(xiàn)。有時候思路錯了,思考的方向錯了,問題會越陷越深,出現(xiàn)無頭緒的狀態(tài)。在這個時候我們應該跳出來,重新去審視這個問題,用另一種方法去解決。通過重新審視問題,發(fā)現(xiàn)要建立關系,表頭必須是要存放在二維的表中,只要建立一張基礎關系數(shù)據(jù)表,用來對象給導出控件賦值遍歷識別是否是用戶選中的列名。這基礎數(shù)據(jù)表要求數(shù)據(jù)全即涵蓋全部的導出字段,且每個字段需有一個對應的固定的標記空間用來標記用戶是否選中這個字段。動態(tài)表頭存放在datatable中,沒有處理的表頭數(shù)據(jù)與基礎關系表的表頭一致,再通過轉過來列名進行篩選,保證數(shù)據(jù)的一致性。在此之前需要給這73個列名固定的順序(按照客戶需求的排序)。從而得出解決方案,如下圖
附件:http://down.51cto.com/data/2365315另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。