2012-11-29 13 views
5

Pracuję nad kodem Java, który zostanie ostatecznie użyty na serwerze aplikacji, aby uzyskać dostęp do naprawdę dużych plików (ponad 1 GB, poniżej 20 GB), ewentualnie hostowanych na NFS dzielić. Serwisowania indywidualny wniosek obejmie ten sposób:java.io.RandomAccessFile skalowalność (lub inne opcje)

  1. Znajdź dużego pliku muszę czytać
  2. Przejdź do przypadkowego punktu w tym pliku
  3. Czytaj bajtów z tego pliku (zwykle pod 1MB)
  4. Powrót te bajty

mam trochę szczęśliwy prosty kod POC w tej chwili, że po prostu otwiera nowy plik tylko do odczytu, a zamyka go:

RandomAccessFile raf=new RandomAccessFile(myFileName, "r"); 
try{ 
    byte[] buffer = new byte[size]; 
    raf.seek(position); 
    raf.reafFully(buffer); 
    return buffer; 
} 
finally{ 
    raf.close(); 
} 

Zastanawiam się, czy jest to elegancko proste podejście, które powinno działać naprawdę dobrze, lub głupio uproszczone podejście, które będzie miało wiele problemów pod dużym obciążeniem (i być może muszę stworzyć bezpieczny dla wątków zbiór czytelnicy itp.). Oczywiście testowanie tego założenia byłoby najlepsze, ale zastanawiałem się, czy istnieją jakieś najlepsze praktyki lub znane problemy z którymkolwiek z tych podejść. Do tej pory nie byłem w stanie rozgryźć google ...

Dzięki!

PS. Nie jest jeszcze jasne, czy ostateczna wersja tego będzie hostowana w systemie Windows lub * nix. Nie jest też jasne, jak duże pliki zostaną udostępnione. PPS. Prawdopodobnie serwery aplikacji są skonfigurowane w klastrze, więc dwa różne serwery aplikacji mogą potrzebować jednocześnie przeczytać ten sam duży udostępniony plik.

+1

Wygląda dobrze dla mnie. nie można uzyskać szybciej niż to, chyba że buforujesz plik na dysku lokalnym lub w pamięci – irreputable

+0

Więc koszt otwierania i zwalniania uchwytów plików jest znikomy? Nawet w poprzek, powiedzmy, udziału NFS? – Dave

+0

to prawdopodobnie nie jest pomijalne, nawet w plikach lokalnych. jeśli jest to problemem, możesz zachować pulę uchwytów. lub, pozostaw 1 "FileChannel' otwarty, przeczytaj go jednocześnie przez" read (dst, position) " – irreputable

Odpowiedz

2

Inną opcją jest Java NIO, a mianowicie FileChannel. FileChannel jest również dostępny do nawigacji i może być szybszy niż RandomAccessFile, ponieważ może pracować z tak zwanymi bezpośrednimi buforami. Ma kilka ciekawych funkcji, np. Jest przerywana.

+0

Dobre połączenie. Tak, testowałem z tymi. Wydaje się, że jest to pomijanie szybsze, ale nie na tyle szybkie, aby koniecznie uzasadnić złożoność * tego * szczególnego przypadku użycia. Ostatnio zostałem spalony przez nio z powodu fizycznego wycieku pamięci Windows w JVM w innej aplikacji, więc byłem trochę niezdecydowany, aby go użyć od tego czasu. Szczerze mówiąc, jeśli podejście dostępu bezpośredniego działa pod obciążeniem, tak samo jak w przypadku testów z pojedynczym gwintem, jest to dla mnie idealne. – Dave

+0

Dobrze, sprawdź jeszcze raz, czy jeszcze nie http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-foutoutstreamstream-performance- usefulness –

Powiązane problemy