2014-12-05 17 views
0

我想提出這個一般問題。如果我們有一個從程序外部讀取數據的程序,我們應該首先將數據放入一個容器中,然後處理這些數據,或者我們是否應該直接在流上工作,如果語言的流api足夠強大的話?我應該將流注入一個刺痛/容器中進行操作嗎?

例如。我正在寫一個從文本文件讀取的程序。我應該首先將數據放入字符串中,然後進行操作,而不是直接在數據流上工作。我正在使用java,讓我們說它已經足夠強大(爲我的需要)流類。

+0

你想對文件內容做什麼樣的操作?我個人認爲,如果可以直接做直接做。不需要兩次工作 – Baby 2014-12-05 02:04:46

+0

@Jonjongot我在做非常基本的東西,但是java提供了非常強大的東西,像RandomFileAccess(你基本上可以做任何事情)。我只是沒有看到它的重點。爲什麼不復制一個數組並按部分操作? – khajvah 2014-12-05 02:09:15

回答

0

流處理通常優選在存儲器累積數據。 爲什麼?一個明顯的原因是你正在閱讀的文件可能不適合內存。在完全讀取數據之前,您甚至可能不知道數據的大小(想象一下,您正在從套接字或管道而不是文件讀取數據)。

這也是更有效的,特別是,當大小不是提前知道的 - 分配大塊的內存和它們之間來回移動數據可以徵稅。像處理和連接大字符串的事情也不是免費的。

如果io速度很慢(曾嘗試從磁帶讀取?)或者數據是由同級進程(套接字/管道)實時生成的,那麼您對數據讀取的處理可能至少部分,與閱讀並行發生,這會加快速度。

流處理本質上更容易擴展,如果需要並行的,因爲你的邏輯是被迫只能依靠當前元素上,正在處理,你是從國家免費。如果數據量過大而無法順序處理,則可以通過添加更多閱讀器並在它們之間拆分流來輕鬆縮放應用程序。

你可能會認爲,在情況沒有這個問題,因爲你正在閱讀的文件只有300個字節。事實上,對於少量的數據來說,這並不重要(當你處理數據時,你也可以對其進行冒泡排序),但採用良好的模式和實踐會使你成爲更好的程序員,並且在重要時幫助你。它沒有缺點。不,它不會讓你的代碼更復雜。起初你可能看起來如此,但這僅僅是因爲你不習慣流處理。一旦你進入了正確的思維模式,並且對你來說很自然,你會發現,如果有的話,代碼一次只處理一小部分數據,而不關心索引,指針和位置,是比替代方案更簡單

上述

所有適用於順序處理雖然。您讀取數據流一次,立即處理數據,並丟棄數據(或者可能寫入流水線中的下一個數據流)。

你提到的RandomAccessFile ...這是一個完全不同的野獸。如果您需要隨機訪問,並且數據適合內存,請將其放入內存中。來回查找文件在概念上是相同的,只是慢得多。除了保存內存以外,沒有任何好處。

0

您當然應該在收到它的時候處理它。另一種方式增加了延遲並且不能縮放。

相關問題