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)
- Znajdź dużego pliku muszę czytać
- Przejdź do przypadkowego punktu w tym pliku
- Czytaj bajtów z tego pliku (zwykle pod 1MB)
- 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.
Wygląda dobrze dla mnie. nie można uzyskać szybciej niż to, chyba że buforujesz plik na dysku lokalnym lub w pamięci – irreputable
Więc koszt otwierania i zwalniania uchwytów plików jest znikomy? Nawet w poprzek, powiedzmy, udziału NFS? – Dave
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