簡體   English   中英

帶有大型CSV的C#交叉檢查慢速數據庫

[英]C# crosscheck slow database with large CSV

我有一個數據庫,運行速度並不快,並且有一個大約65000行的CSV大文件。 我需要對它們進行交叉檢查,並在需要時更新數據庫。

  • 在CSV中,有一個包含數據庫ID的列。 它始終是1:1的關系。
  • CSV可能包含數據庫的新輸入,因此可能沒有數據庫條目。
  • 我不能遍歷CSV並檢查每一行,因為它太慢了。
  • 首先從數據庫中獲取所有結果並將它們存儲起來以遍歷每次都行不通,因為這會占用大量RAM。

如何執行以下操作:

  • 檢查CSV中的一行是否具有數據庫條目。 如果是這樣,請將其寫到另一個CSV文件中。
  • 如果該行沒有數據庫條目,請將其寫入另一個文件。
  • 將時間間隔保持在5分鍾以內,最好縮短。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM