Pytanie w sprawie java, database – Java - zapisywanie i przesyłanie tablic do / z pamięci na dysk

2

Mam tablicę int i float o długości 220 milionów (naprawiono). Teraz chcę zapisać / przesłać te tablice do / z pamięci i dysku. Obecnie używam FileChannel Java MIO i MappedByteBuffer, aby rozwiązać ten problem. Działa dobrze, ale trwa około 5 sekund (czas zegara ściennego) do przechowywania / przesyłania tablicy do / z pamięci na dysk. Właściwie chcę szybciej. Czy ktoś może mi pomóc, czy jest jakaś wbudowana biblioteka / baza danych java / inne podejście do znacznie szybszego przesyłania / przechowywania tablic? Szczególnie zależy mi na wgrywaniu do pamięci z dysku. Chcę to zrobić szybciej. Jeśli więc czas przechowywania wzrośnie, to nie mam problemu. Z góry dziękuję.

Kod, którego używam, jest podany poniżej (jeśli jest wymagany):

int savenum = 220000000 ;

public void save() {
 try {
    long l = 0 ;
FileChannel channel = new RandomAccessFile(str1, "rw").getChannel();
MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_WRITE, 0, savenum * 8);
mbb.order(ByteOrder.nativeOrder());

for(int i = 0 ; i < savenum ; i++){
l = a[i] ;
 mbb.putLong(l);
}
channel.close();

FileChannel channel1 = new RandomAccessFile(str2, "rw").getChannel();
MappedByteBuffer mbb1 = channel1.map(FileChannel.MapMode.READ_WRITE, 0, savenum * 4);
mbb1.order(ByteOrder.nativeOrder());

for(int i = 0 ; i < savenum ; i++){
 int ll = b[i] ;
 mbb1.putInt(ll);
 }
 channel1.close();
 }
  catch (Exception e){
    System.out.println("IOException : " + e);
  }
 }

 public void load(){
 try{
 FileChannel channel2 = new RandomAccessFile(str1, "r").getChannel();
  MappedByteBuffer mbb2 = channel2.map(FileChannel.MapMode.READ_ONLY, 0, channel2.size());
 mbb2.order(ByteOrder.nativeOrder());
  assert mbb2.remaining() == savenum * 8;
 for (int i = 0; i < savenum; i++) {
 long l = mbb2.getLong();
 a[i] = l ;
 }
 channel2.close();

  FileChannel channel3 = new RandomAccessFile(str2, "r").getChannel();
   MappedByteBuffer mbb3 = channel3.map(FileChannel.MapMode.READ_ONLY, 0, channel3.size());
   mbb3.order(ByteOrder.nativeOrder());
   assert mbb3.remaining() == savenum * 4;
    for (int i = 0; i < savenum; i++) {
    int l1 = mbb3.getInt();
    b[i] = l1 ;
    }
    channel3.close();
    }

    catch(Exception e){
    System.out.println(e) ;
      }
    }
Dla 440 milionów przedmiotów 5 sekund brzmi całkiem nieźle. Hunter McMillen
@Arpssss, następnie przygotuj pamięć podręczną systemu plików, prześlij bufor readahead. Odczytaj dane przed rozpoczęciem programu. Przykro mi, nie ma wiele rzeczy, które możesz zrobić na poziomie Java. J-16 SDiZ
@HunterMcMillen, chcę szybciej :). Arpssss
@davidfrancis, dzięki. Właściwie używam go na serwerze, którego nie mogę uaktualnić. Mogę zainstalować tylko niektóre programy lub uruchomić mój kod. Arpssss

Twoja odpowiedź

1   odpowiedź
3

możesz zmienić kod, aby w ogóle nie wykonywać kopii. tj. użyj ByteBuffer lub IntBuffer lub LongBuffer. Ma to tę zaletę, że zapisuje kopię na stertę tego, co już stertujesz, ale także ładujesz tylko podczas jej używania. tzn. przetwarzanie może być zbieżne z ładowaniem.

Użycie tego podejścia powinno skrócić czas początkowego „obciążenia” do około 10 ms i nie ma czasu „oszczędzania”, ponieważ będzie on już dostępny dla systemu operacyjnego.

Powiązane pytania