Frage an database, java – Java - Speichern und Hochladen von Arrays auf / vom Speicher auf die Festplatte

2

Ich habe ein int- und float-Array mit einer Länge von 220 Millionen (fest). Jetzt möchte ich diese Arrays in / aus dem Speicher und auf die Festplatte speichern / hochladen. Derzeit verwende ich FileChannel und MappedByteBuffer von Java NIO, um dieses Problem zu lösen. Es funktioniert einwandfrei, benötigt jedoch ungefähr 5 Sekunden (Wanduhrzeit) für das Speichern / Hochladen des Arrays zum / vom Speicher auf die Festplatte. Eigentlich will ich schneller eins. Kann mir jemand helfen, gibt es eine eingebaute Java-Bibliothek / Datenbank / einen anderen Ansatz, um das Hochladen / Speichern von Arrays viel schneller zu machen? Mir ist es besonders wichtig, Daten von der Festplatte in den Speicher hochzuladen. Ich möchte es schneller machen. Also, wenn sich die Speicherzeit dafür erhöht, habe ich kein Problem. Danke im Voraus.

Der von mir verwendete Code ist unten angegeben (falls erforderlich):

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) ;
      }
    }
@Arpssss, erst den Dateisystem-Cache und dann den Readahead-Puffer. Lesen Sie die Daten vor dem Programmstart vor. Entschuldigung, es gibt nicht viel, was Sie in Java Level tun können. J-16 SDiZ
Für 440 Millionen Artikel klingen 5 Sekunden ziemlich gut. Hunter McMillen
Wie groß wird die Datei auf der Festplatte? Ich stimme eher mit Hunter überein - die Zeit klingt ziemlich gut für mich. Offensichtlich könnten Sie Ihren Computer (z. B. mit RAID) aktualisieren, um die Festplattenleistung zu verbessern? Sind Sie nicht sicher, ob eine SSD beim Schreiben hilft? davidfrancis
Allerdings kann eine SSD hilfreich sein, wenn Sie nach Leseleistung suchen davidfrancis

Deine Antwort

1   die antwort
3

können Sie Ihren Code ändern, damit Sie überhaupt nicht kopieren. Verwenden Sie d. h. den ByteBuffer oder IntBuffer oder LongBuffer. Dies hat den Vorteil, dass eine Kopie in den Heap von dem gespeichert wird, was Sie bereits außerhalb des Heapspeichers haben, aber auch, dass Sie nur laden, wenn Sie ihn verwenden. d.h. Ihre Verarbeitung kann gleichzeitig mit dem Laden erfolgen.

Bei Verwendung dieses Ansatzes sollte die anfängliche Ladezeit auf ca. 10 ms verkürzt werden, und es wird keine Speicherzeit benötigt, da sie dem Betriebssystem bereits zur Verfügung steht.

Verwandte Fragen