2012-01-17 4 views
6

Potrzebuję wysłać obrazy i małe pliki wideo (około 5 MB, mniej niż 10 MB) do usługi REST, którą napiszę. Zastanawiam się, czy powinienem użyć Byte [] lub Stream, aby wykonać to zadanie. Jaka byłaby linia podziału pod względem rozmiaru pliku transferu między używaniem Byte [] a strumieniem?Kiedy używać tablicy bajtów i kiedy używać strumienia?

Odpowiedz

9

Ilość wolnej pamięci, którą jesteś skłonny zaangażować się w transakcję, jest Twoją jedyną prawdziwą przeszkodą.

Jeśli masz plik 5M, musisz załadować całą zawartość do pamięci RAM, która będzie kosztować 5M.

Jeśli przesyłasz strumieniowo, możesz użyć znacznie mniej pamięci, czytając małe porcje z pliku do bufora wielokrotnego użytku i zapisując te porcje do strumienia HTTP.

5

Ostatecznie, wyślesz strumień w obie strony.

Jeśli otrzymałeś dane z innego źródła, poza kontrolą, jako ogromny byte[], równie dobrze możesz zachować je w tym formularzu do przetwarzania, chyba że jest to niewygodne dla Ciebie, i pozwolić, aby został on wciśnięty do sieci w dół linia.

Jeśli odbierasz go jako strumień, nie ma sensu przekształcać go w masywny kod byte[] tylko po to, aby go przenieść do innego strumienia. Użyj bufora 4 lub 8 kiB (4 lub 8 zamiast 4 do 8, ponieważ istnieją pewne niewielkie zalety w zbieżności liczby stron pamięci z tymi, które możesz równie dobrze wykorzystać).

Jeśli tworzysz to sam, strumień jest łatwiejszy w większości przypadków (zawijanie w binarnym lub tekstowym pisarzu i pracuj przez to), a także wydajniejszy.

Bardziej ogólnie, jeśli widzę bufor o wielkości powyżej 8kiB, który jest zapisywany lub odczytywany ze strumienia, to zauważę, że jako pierwszą rzeczą jest próba zmiany, jeśli rzeczy wydają się zbyt wolne.

0

Ogólny test przy wyborze między tablicą bajtów lub strumieniem zależy od tego, czy wiesz, z góry, ile bajtów znajduje się w danych, i czy ta liczba jest względnie mała dla danego celu.

Na przykład, jeśli masz do czynienia z małym plikiem ikon (mniej niż 50 KB) dostępnym na komputerze lokalnym i znasz plik, idź z tablicą bajtów.

Odwrotnie, jeśli pracujesz z plikiem filmowym, w którym byłoby trudno, nie wspominając już niepotrzebnie, zachować 2 GB zawartości w pamięci jednocześnie, użyj strumienia.

Strumienie są najlepsze do przenoszenia większych zestawów danych lub danych, których długość nie jest znana z góry.