2010-06-18 24 views
3

我在另一個系統上有1GB的二進制文件。什麼是最快的設計下載和轉換大型二進制文件?

要求:在主系統上ftp/download並將二進制文件轉換爲CSV文件。

轉換後的文件將是幅度較大〜8GB

什麼是做一些類似的最常用的方法是什麼?
這應該是一個兩步獨立的過程,下載 - 然後轉換?
我應該一次下載小塊並在下載時進行轉換嗎?

我不知道最有效的方法來做到這一點......我應該注意什麼文件這種大小?

任何意見表示讚賞。

謝謝。

(Visual Studio C++)

回答

5

我會寫一個程序,將二進制格式和輸出轉換爲CSV格式。該程序將從標準輸入讀取並寫入標準輸出。

然後我會打電話

wget URL_of_remote_binary_file --output-document=- | my_converter_program > output_file.csv 

這樣,您就可以立即開始轉換(無需下載整個文件)和你的程序不具有聯網處理。假設它足夠便攜,您也可以在遠程端運行程序。

+0

我不知道我完全理解如何在不下載整個文件的情況下立即開始轉換。我喜歡這個想法,你能否詳細說明一下? – 2010-06-18 18:15:36

+1

@Tommy,'wget'在開始寫入之前不會讀取整個文件,只要它獲得合理的文件塊就會寫入。當管道機制可用時,管道機制應立即將其傳遞給您的轉換器程序。這是非常典型的* nix思維。 – 2010-06-18 19:01:06

+0

@標記 - 有沒有一種方法可以在Windows下模擬此操作而無需下載任何新庫? – 2010-06-18 19:06:39

2

這取決於您的數據和您的要求。你有什麼樣的性能要求?你是否需要在X時間內完成諸如任務(速度至關重要),或者這是否會定期完成(在這種情況下速度不是必需的)?

也就是說,如果將工作分成兩個任務 - 下載程序和轉換程序,您肯定會獲得更清晰的實現。這樣,每個組件都可以變得簡單,只需將注意力集中在手頭的任務上。所有的事情都是平等的,我推薦這種方法。

否則,如果您嘗試同時下載/轉換,您可能會遇到下載程序已準備好數據的情況,但轉換器需要更多數據才能繼續。再一次,沒有理由說明你的代碼無法處理這個問題,但它會使實現變得更加複雜,而且更難調試/測試/驗證。

+0

有兩個獨立的任務,但有足夠的下載後轉換開始考慮「下載/同時轉換」?謝謝。 – 2010-06-18 18:34:39

4

不知道任何細節,我會去一個二進制ftp下載,然後用一個單獨的轉換程序後處理。這將把這個過程分解成兩個獨立和不相關的部分,這將有助於構建和調試整個系統。不需要重新創建FTP系統,並且有很多優化後處理的潛力。

1

通常更好的做法是將它作爲單獨的進程而沒有相互依賴性。如果您的需求在將來發生變化,您可以重複使用這些部分,或將其用於其他項目。

3

爲了避免太多的流量,我會在第一步壓縮並傳輸文件。轉換過程中,如果出現錯誤或想要另一個輸出,可以在本地重做,而不必重新獲取數據。

唯一的預防措施是不加載內存中的所有東西,然後轉換,但像你說的那樣進行塊大小寫。您可以通過創建/預先分配最大預期大小的大文件來防止程序用戶產生一些令人不快的效果。這樣可以避免在轉換階段耗盡磁盤空間。另外一些文件系統不喜歡大於2GB或4GB的文件,這也會被預分配技巧所捕獲。

1

以下是關於你的需求和可能的解決方案更是猜測:

  • 關注文件的完整性?實現包括序列號,大小字段和校驗和/哈希等完整性檢查,以及恰好足夠的事務語義,以便系統知道傳輸是否完成。
  • 上傳是發生在緩慢/擁塞的鏈接上,可能會中斷嗎?實施允許中斷後恢復傳輸的協議。
  • 上傳是否重複發生,大部分數據保持不變?實施一些適合增量更新的方式,所以你只上傳差異。
+0

好的問題,還沒有得到那麼多,但完整性是。 – 2010-06-18 19:09:43

相關問題