[英]C# crosscheck slow database with large CSV
我有一個數據庫,運行速度並不快,並且有一個大約65000行的CSV大文件。 我需要對它們進行交叉檢查,並在需要時更新數據庫。
如何執行以下操作:
CSV有很多列(例如70),但是我只需要第5列就可以對ID進行交叉檢查。 我試圖先遍歷CSV文件,然后再與數據庫進行檢查,但這太慢了。 可能需要10分鍾以上。 我還嘗試過從數據庫中獲取所有條目,並遍歷這些條目。 通過循環,遍歷CSV(使用BufferedStream
),並進行檢查。 這確實可以顯着減少時間(最多5分鍾),但是將無法記錄數據庫中不存在的條目。
有什么辦法可以保持速度嗎?
沒有足夠的信息來給您適當的分析,並最終得出解決該問題的方法。 我可以給一些建議。 對於記錄而言,具有65,000條記錄的CSV並不是那么大。 我也不同意走文件太慢,因為我親自使用流讀取器來比較大小為千兆字節的文件,而文件大小可能要大一個數量級。
首先,您可以考慮扭轉問題。 與其在CSV中運行時不拉數據庫,不如考慮將整個集合拉到內存中(如果您有龐大的數據庫,這不是一個好主意,但如果可管理,則是一個選擇)。 如果更大一點,您甚至可以將數據庫寫出來(假設這是一個表或視圖(或可能是視圖的查詢))為不同的CSV。 這里的核心焦點是使慢速數據庫脫離循環。 注意:如果這是一個高度事務性的系統,並且您需要“最新(或5分鍾)准確的快照”,這可能不足。 我發現這是一個不切實際的期望(也就是說,盡管進行了大量編輯,但數據現在仍代表5分鍾前)。
接下來,您可以考慮減少變形。 您的問題中已經提到的一種簡單方法是將工作CSV從70列減少到所需的5列。 如果您將相同的數據從數據庫中拉出來進行比較,則可能同樣如此。 僅當加載時間成為瓶頸時,這才有效。 根據您的描述,我非常懷疑情況是否如此。
您還可以考慮將數據的兩位放入內存中並在那里進行計算。 非常快。 如果由於大小而無法將兩個項目比較到內存中,則此方法將行不通,這就是為什么篩選所需的列是一個有用的練習的原因。
由於您提到了數據庫ID,因此聽起來像CSV檢查了多個數據庫。 考慮先按數據庫ID排序CSV。 如前所述,有些排序算法非常快,應該能夠在幾秒鍾內對65,000條記錄進行排序。 排序的瓶頸通常是內存量和I / O的速度(主要是磁盤速度)。 然后,您可以攻擊每個數據庫。
正如我在開始時所說,我只有足夠的信息來提供提示,而沒有實際的解決方案,但希望這會激發一些想法。
較晚的答案,但是我已經通過以下方式解決了:我正在將所需的CSV列拉入DataTable
。 然后,我獲取所有需要檢查的行(可以過濾的特定行數),並遍歷這些數據庫行。 每行將檢查DataTable
的相應ID,並將DataTable
放入新的CSV中。 之后,DataTable中的行將被刪除。 最后,我有一個包含確實存在的行的CSV,它將被導入到系統中,還有一個DataTable,它將被導出為具有需要添加的行的CSV。
感謝格雷戈里(Gregory)幫助我走上正確的道路。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.