2011-06-23 73 views
0

我已經開始對項目數據的,這裏是我有:含有450K記錄搜索大型Excel文件和處理大量有效

Excel文件(exl1),具有50K以上每月。

exl1格式

invoice#|Box#|Serial-#1|Serial-#2|5-val-enum#1|5-val-enum#2|10-val-enum|4-val-enum|timestamp 

EX1: abc123|box1|0987654321|A123456789|Plant|Tree|PersonName1|North|DateTime.Now

EX2:含大約50K記錄 qwe345|box9|123456789|#NA|Animal|Cat|PersonName1|South|DT.Now

Excel文件(exl2)。 (名爲searchcVal爲了解釋的目的) exl2格式 接口Serial1

EX1A: A123456789

EX1B: 0987654321

EX2A: 123456789

這是我必須做的:

  1. 取決於5-VAL-枚舉exl1的#1的值在exl2(searchval)的每個值進行比較,以任一序列號1或序列號2(例1 =植物,示例2 =動物)

  2. 如果searchVal以[az]搜索serial2開頭,否則搜索serial1;因此,與searchVal EX1A搜索COL3和serachval EX1B搜索COL2

    if (exl1.Rows[columnHeader][col4].ToString() == "Plant") 
        { 
         string rowVal = exl2.Rows[rowIterator][col0].ToString(); 
         if (regex.IsMatch(rowVal[0].ToString()))//checks to see if serial1 or serial2 
         { 
          if (rowVal == exl1.Rows[rowIterator][col3].ToString()) 
          { 
           //add matched row to ResultsDT 
          } 
          else 
          { //next row 
          } 
         } 
         else 
         { //search col2 with same procedure 
         } 
        } 
        else 
        {//search col2 
        } 
    
  3. 爲了解釋讓說着想PERSON1匹配的400個工廠,其中100人是樹木,100種人是灌木,有100個人是草和100開滿鮮花, 他匹配了400只動物,其中100只是貓,狗,蛇和鳥類。這些匹配我想總結一下 的輸出摘要1:PersonName | Plants | Animals | category3 | Category4 | Category5對每個類別都有更詳細的描述,例如 概要2:PersonName | Trees | Bushes | Grasses |通向SUMM1的花:Person1 | 400 | 400 | x | n | y SUMM2(僅限植物):Person1 | 100 | 100 | 100 | 100

  4. 最重要的是:所有這些都不會殺死它正在運行的PC 3小時,同時其計算

回答

1

我假設這裏的問題是「我怎樣纔能有效地執行這個任務?」

答案是,你不應該。這聽起來像是你試圖以便宜的價格購買OLAP(除了那個,它可能不是嚴格在線發生的),並且已經有很多解決方案可用於此。

由於您已經有了使用Excel電子表格的既定程序,PALO可以滿足您的需求(編輯:它是免費的)。

另外,你有什麼是非規範化的記錄集;如果將它標準化爲幾組&將其輸入到數據庫中(顯然,使用腳本),則可以讓數據庫負責密集型計算。 編輯:有很多免費的數據庫可以使用(SQL是一種語言,而不是品牌)。例如。 PostgrSQLMySQL

如果你堅持解析文件&自己分析的文件,那麼我建議你修改你的算法做兩件事情:

首先,讓您的50K的記錄集以適應少記憶儘可能合理。顯然,你不想將你的記錄存儲爲50k字符串:解析它們,並建立一個內存結構,讓你只訪問你需要的信息。編輯:沒關係,誤解了你的輸入數據。其次,修改你的算法,使其可以零碎運行。目前,您有一組50k記錄和另一組450k記錄,聽起來您希望每個月(或更頻繁)在整套記錄上運行您的程序+無論記錄已添加到450k組記錄。如果您開始存儲增量結果,則可以對腳本進行構造,以便一次處理(例如)從450k記錄集一次處理多達10k條記錄,然後按順序運行多個腳本實例,從而避免重複 - 每月分析整個450k記錄,並且還有一個方便的方法來中止&中途(使用某種父腳本)。

對於更復雜的方法,請參閱Divide and Conquer,因爲它適用於算法。

+0

原諒我,如果我聽起來像一個白癡,但是有建議的內存結構的原因嗎?我必須通過所有的記錄,所以所有的信息是必要的。 另外,有沒有你推薦的書? – Dani

+0

啊我的錯誤,我理解你的一組50k記錄與你的較大記錄集的格式相同(你的解釋有點難以理解);如果它完全由長達20個字符的字符串組成,那麼可以做更多的事情來使事情更快。 [CLR的算法簡介](http://en.wikipedia.org/wiki/Introduction_to_Algorithms)或多或少是算法ABC的goto書,但我懷疑它對於你想要的算法來說有點重量級/低ROI做。 – Caspar

+0

也許我的C#只是生鏽了,但是從你的示例中我不清楚你是如何讀取你的excel文件的。你是否正在使用一個庫來讀取一個.xls(x)文件(如果是的話,那個庫將整個文件轉儲到內存中,或者根據需要從磁盤讀取),還是解析csv導出(或類似的)數據? – Caspar

1

根據Excel的更新/查詢行程的比率,它可能是簡單地讀出的值到SQL Server數據庫和查詢/過程中出現的數據是個好主意?我可以想象,它需要一些時間來閱讀值到SQL Server,但查詢應該沒有時間......

+0

我非常喜歡這樣做,唯一的事情是我幾乎沒有使用Sql Server的經驗,即使我做了我工作的公司也買不起許可證 – Dani

2

至少有兩個選項:

  1. 款待Excel作爲數據庫,並檢查其性能 - 這裏是如何做到這一點:http://www.beansoftware.com/NET-Tutorials/Excel-ADO.NET-Database.aspx
  2. 如果選項1太慢導入這個數據到一個真實的數據庫(ms sql,mysql,postgresql等),添加適當的索引並在數據庫中執行搜索。excel將被視爲初始導入的數據源。
+0

謝謝我正在研究它 – Dani