這實際上取決於任務的「大」和可用資源(在這種情況下是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而沒有接受採訪。」
我並不感到驚訝,他們可能正在考慮是否有能力創建算法並提供簡單的解決方案,但無需使用「現成」解決方案。
他們可能正在考慮看到你使用動態數組並創建一個(或多個)排序算法。
「我應該使用字符串列表還是類似的東西?」
答覆可能是一樣的,我想他們想看看你是如何「工作」的。
我認爲你在給出的規格範圍內做得很好。大文件?因此,使用不是基於內存的替代數據庫解決方案 - 您的解決方案只是縮放而不改變其他任何內容。 – mj2008 2012-02-22 12:06:59
謝謝mj2008我在寫作的時候這麼認爲,也試圖以非常防禦性的方式編寫解決方案,但考慮到Dorin的答案,我現在可以明白爲什麼面試官想以不同的方式看到這一點。 – Mattgb 2012-02-22 12:21:25
我同意@ mj2008。將'CSV'與'ADO'聯繫起來是一個非常好的答案。我本能的解決方案本來是一樣的。如果你知道如何用'TADODataset'處理'CSV'文件,那麼你肯定知道如何「低技術」一行一行地讀取文本文件... – kobik 2012-02-22 13:00:04