您好,登錄后才能下訂單哦!
一、問題來源
1.1問題現象
動態多字段導出內存溢出
1.2問題分析
從問題的現象中找不到問題出現根源,需要通過捕獲異常來分析問題具體出在那
通過不同參數導出測試,發現30個以內的列名導出沒有問題,超過其上限在datatable給控鍵(原來用aspose控件)賦值中就拋出了異常。當初以為是控件問題,就嘗試用NOPI控件,但是問題依然存在。由此可見內存溢出很大原因是來自要到導出的列名太多(73個字段),讀取datatable的值時導致了內存溢出,需要用另一種方式來替換通過讀取datatable賦值的方式來實現給導出控件賦值。
二、解決方法
找到了導致問題出現的最大可能,接下來就是如何去解決。如果每次都是全部導出,這個問題好解決,直接通過foreach逐行讀取對象集合給控件賦值就ok了,問題是需要按照客戶選定的列名動態導出,找出需要導出的字段與其對象屬性的對應關系是解決問題的關鍵所在。當時嘗試用了通過xml配置文件找到它們對應關系,但并未能實現,原因是動態控制難實現。有時候思路錯了,思考的方向錯了,問題會越陷越深,出現無頭緒的狀態。在這個時候我們應該跳出來,重新去審視這個問題,用另一種方法去解決。通過重新審視問題,發現要建立關系,表頭必須是要存放在二維的表中,只要建立一張基礎關系數據表,用來對象給導出控件賦值遍歷識別是否是用戶選中的列名。這基礎數據表要求數據全即涵蓋全部的導出字段,且每個字段需有一個對應的固定的標記空間用來標記用戶是否選中這個字段。動態表頭存放在datatable中,沒有處理的表頭數據與基礎關系表的表頭一致,再通過轉過來列名進行篩選,保證數據的一致性。在此之前需要給這73個列名固定的順序(按照客戶需求的排序)。從而得出解決方案,如下圖
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。