2012-02-22 79 views
6

我有一個面試前的任務,我已經完成並且解決方案能夠正常工作,但是由於使用了TADODataset,我被打了下來並沒有接受採訪。我基本上導入了一個填充數據集的CSV文件,數據必須以特定的方式處理,所以我使用數據集的過濾和排序來確保數據按我想要的方式排序,然後執行了在while循環中進行邏輯處理。收到的反饋表示這很糟糕,因爲它對大文件來說會很慢。從德爾福的CSV文件導入和處理數據

這裏我的主要問題是,如果在內存數據集中使用處理大文件的速度較慢,那麼從csv文件訪問信息的更好方法是什麼?我應該使用String List還是類似的東西?

+0

我認爲你在給出的規格範圍內做得很好。大文件?因此,使用不是基於內存的替代數據庫解決方案 - 您的解決方案只是縮放而不改變其他任何內容。 – mj2008 2012-02-22 12:06:59

+0

謝謝mj2008我在寫作的時候這麼認爲,也試圖以非常防禦性的方式編寫解決方案,但考慮到Dorin的答案,我現在可以明白爲什麼面試官想以不同的方式看到這一點。 – Mattgb 2012-02-22 12:21:25

+0

我同意@ mj2008。將'CSV'與'ADO'聯繫起來是一個非常好的答案。我本能的解決方案本來是一樣的。如果你知道如何用'TADODataset'處理'CSV'文件,那麼你肯定知道如何「低技術」一行一行地讀取文本文件... – kobik 2012-02-22 13:00:04

回答

3

這實際上取決於任務的「大」和可用資源(在這種情況下是RAM)。

「收到的反饋表示這很糟糕,因爲它對大文件來說會很慢。」

CSV文件通常用於移動數據(在大多數情況下,我遇到的文件大約是1MB +高達〜10MB,但這並不是說別人不會將更多數據轉儲爲CSV格式),而不用擔心很多(如果有的話)關於進口/出口,因爲它非常簡單。

假設你有一個80MB的CSV文件,現在這就是你想要的塊來處理文件,否則(取決於您的處理),你可以吃數百MB的RAM,在這種情況下,我會做的是:

while dataToProcess do begin 
    // step1 
    read <X> lines from file, where <X> is the max number of lines 
    you read in one go, if there are less lines(i.e. you're down to 50 lines and X is 100) 
    to process, then you read those 
    // step2 
    process information 
    // step3 
    generate output, database inserts, etc. 
end; 

在上面的例子中,你並沒有將80MB的數據加載到RAM中,但只有幾百KB,其餘的用於處理,即鏈接列表,動態插入查詢(批量插入)等。

「......但是我被打倒了,因爲使用了TADODataset而沒有接受採訪。」

我並不感到驚訝,他們可能正在考慮是否有能力創建算法並提供簡單的解決方案,但無需使用「現成」解決方案。

他們可能正在考慮看到你使用動態數組並創建一個(或多個)排序算法。

「我應該使用字符串列表還是類似的東西?」

答覆可能是一樣的,我想他們想看看你是如何「工作」的。

+1

在我的辦公室,我們每個月都會處理一個4GB + CSV文件(在其他地方生成並可用zip格式下載)。不用說,ADODataSet或ClientDataSet在這裏不是一個可行的解決方案。 :) – 2012-02-22 12:00:49

+0

謝謝你的答案多林,使用動態數組和排序算法只是沒有進入我的思維過程。我想我一直在使用Ado和SQL數據庫的時間太長了,也許需要考慮解決問題來擴展我的知識。 – Mattgb 2012-02-22 12:08:22

+0

@KenWhite我覺得有人會創建一個4GB的CSV文件,但這並不意味着這是不可能的,那麼這是一個笑話還是?坦率地說,從來沒有聽說過超過~100MB的CSV ...這也是非常不切實際的... – ComputerSaysNo 2012-02-22 12:21:05

0

面試官說的很對。

任何媒體文件的正確的,可擴展的,最快的解決方法向上是使用「外部排序」。

「外部排序」是一個2階段的過程,第一階段是將每個文件拆分爲可管理和排序的較小文件。第二階段是將這些文件合併回單個排序文件,然後逐行處理。

對於超過200,000行的任何CSV文件都是非常有效的。可以控制進程運行的內存量,因此可以消除內存不足的危險。

我已經實現了很多這樣的排序過程,並且在Delphi中會推薦TStringList,TList和TQueue類的組合。

好運