3 回答

TA貢獻(xiàn)1818條經(jīng)驗 獲得超8個贊
您應(yīng)該問的第一個問題是您首先需要將文件寫入磁盤的天氣。即使您應(yīng)該在處理階段結(jié)束時將文件發(fā)送給使用者,您也可以將文件內(nèi)容保存在內(nèi)存中并發(fā)送。消費者并不關(guān)心文件是否存儲在磁盤上,因為它只接收包含文件內(nèi)容的字節(jié)數(shù)組。
將文件存儲在磁盤上的唯一情況是如果您通過磁盤文件在進程之間進行通信(即您的生產(chǎn)者將文件寫入磁盤,向您的消費者發(fā)送一些通知,然后您的消費者讀取該文件從磁盤 - 例如基于它從通知收到的文件名)。
關(guān)于 I/O 最佳實踐,請確保使用緩沖區(qū)讀?。ú⒖赡軐懭耄┪募?。這可以大大減少內(nèi)存開銷(因為您最終只會在內(nèi)存中保留一個塊而不是整個 20 MB 文件)。
關(guān)于添加多個線程,您應(yīng)該測試天氣是否可以提高您的應(yīng)用程序性能。如果您的應(yīng)用程序已經(jīng)是 I/O 密集型的,那么添加多個線程將導(dǎo)致在您的 I/O 流上增加更多的爭用,從而導(dǎo)致性能下降。

TA貢獻(xiàn)1806條經(jīng)驗 獲得超5個贊
如果沒有詳細(xì)的情況,像這樣的問題可能會用現(xiàn)有的軟件更好地解決,比如Apache NiFi:
一個易于使用、功能強大且可靠的系統(tǒng)來處理和分發(fā)數(shù)據(jù)。
它非常擅長獲取文件、轉(zhuǎn)換它們并將它們放在其他地方(以及發(fā)送電子郵件、生成分析等等)。NiFi 是一個非常強大的工具,但如果您需要額外設(shè)置的幾個文件,則可能會有點過分。

TA貢獻(xiàn)1810條經(jīng)驗 獲得超4個贊
鑒于您給出的描述,我認(rèn)為您應(yīng)該在一個線程上對每個文件執(zhí)行操作;即線程將下載文件,處理它,然后上傳結(jié)果。
如果您需要并行性,則將下載/處理/上傳實現(xiàn)為 aRunnable
并將任務(wù)提交到ExecutorService
具有有界線程池的 a 。并調(diào)整線程池的大小。(如果您將線程池大小作為配置屬性公開,這很容易。)
為什么這樣?
很簡單。需要最少的同步。
三個子任務(wù)之一可能是您的性能瓶頸。因此,通過將所有三個任務(wù)合并為一個任務(wù),您可以避免非瓶頸任務(wù)遙遙領(lǐng)先的情況。如果您在某些子任務(wù)上走得太遠(yuǎn),您就有可能耗盡(本地)磁盤空間。
我將與 Alex Rolea 關(guān)于緩沖的說法相矛盾。是的,它可能會有所幫助。但是在典型現(xiàn)代機器上的現(xiàn)代(例如 Linux)操作系統(tǒng)中,內(nèi)存 <-> 磁盤 I/O 不太可能是主要瓶頸。瓶頸更有可能是網(wǎng)絡(luò) I/O 或服務(wù)器端 I/O 性能(特別是如果服務(wù)器同時為其他客戶端提供服務(wù)。)
所以,我不會過早地調(diào)整緩沖。使系統(tǒng)正常工作,對其進行基準(zhǔn)測試,對其進行概要分析/分析,并根據(jù)這些結(jié)果找出真正的瓶頸所在以及如何最好地解決它們。
部分解決方案可能是根本不使用磁盤。(我知道您認(rèn)為您需要這樣做,但除非您的服務(wù)器及其協(xié)議真的很奇怪,否則您應(yīng)該能夠?qū)?shù)據(jù)流式傳輸?shù)娇蛻舳藘?nèi)存不足的服務(wù)器。)
添加回答
舉報