簡體   English   中英

您如何決定用於 InputStream.read() 的 byte[] 大小?

[英]How do you decide what byte[] size to use for InputStream.read()?

從 InputStreams 讀取時,如何決定 byte[] 使用的大小?

int nRead;
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about

while ((nRead = is.read(data, 0, data.length)) != -1) {
  ...do something..
}

你什么時候用小號和大號? 有什么區別? 數字是否要以 1024 為增量? 如果它是來自網絡的 InputStream 與來自磁盤的輸入流,它會有所不同嗎?

非常感謝,我似乎無法在其他地方找到明確的答案。

大多數人使用 2 的冪來表示大小。 如果緩沖區至少為 512 字節,則沒有太大區別( < 20% )

對於網絡,最佳大小可以是 2 KB 到 8 KB(底層數據包大小通常高達 ~1.5 KB)對於磁盤訪問,最快的大小可以是 8K 到 64 KB。 如果您使用 8K 或 16K,則不會有問題。

注意網絡下載,您可能會發現您通常不使用整個緩沖區。 對於 99% 的用例來說,浪費幾 KB 並不重要。

在那種情況下,我總是使用 2 的合理冪,在 2K 到 16K 的范圍內。 一般來說,不同的 InputStreams 會有不同的最優值,但是沒有簡單的方法來確定這個值。

為了確定最佳值,您需要更多地了解您正在處理的 InputStream 的確切類型,以及為 InputStream 提供服務的硬件規格等內容。

擔心這個可能是過早優化的情況。

這主要取決於您擁有多少內存以及您希望讀取多少數據。 您不想太頻繁地阻止,因此請考慮BenCole的回答; 另一方面,如果您的處理速度比實際讀取速度慢,您不希望處理一小塊數據。

我個人嘗試使用庫並將選擇緩沖區大小的任務卸載給庫作者。 在那之后,我向自己保證不再閱讀庫代碼,因為這讓我很生氣。

我還要說的是,如果從InputStream讀取(而不是從ReadableByteChannelFileChannelSocketChannel ),你不應該關心,只要你把它包裝在一個具有“正確”緩沖區大小的BufferedInputStream :內部緩沖區將為您處理讀取,因此您可以專注於讀取您需要的部分。

在這種情況下,緩沖區大小可能就是您要查找的大小,我會將您重定向到@Peter Lawrey 的回答:從網絡訪問數據時為 2-8KB,從硬盤訪問時為 32-64KB(“塊"的磁盤)。

但是,當從ByteChannel讀取時,您必須自己通過ByteBuffer ,您可以使用該值分配該緩沖區。

通過使用InputStream類中的available()方法。 來自 Javadoc:

返回可以從此輸入流讀取(或跳過)的字節數,而不會被此輸入流的方法的下一個調用者阻塞。 下一個調用者可能是同一個線程或另一個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM