Ich brauche Hilfe! Ich kann das Problem nicht lösen, ich stoße an die Grenzen der Hardware

 

Es gibt eine große Menge an Informationen (etwa 20 GB in einer Textdatei).

Die Informationen bestehen aus der gleichen Art von Sequenzen, etwa einer Million davon.

Es ist notwendig, alle Sequenzenwiederholt durchzugehen und einige Berechnungen anzustellen.

Das erste, was einem in den Sinn kommt, ist, den gesamten Inhalt der Datei zu lesen, das Array der Strukturen damit zu füllen und mit ihnen im Speicher zu arbeiten.

Aber es hat nicht funktioniert, bei der nächsten Größenänderung meldet MT "Memory handler: cannot allocate 5610000 bytes of memory".

Manager zeigt, dass terminal.exe 3,5 GB Speicher (von 16 physischen) verwendet. Ich nehme an, dass dies daran liegt, dass der Prozess nur 4 GB erhalten kann.

Bevor Sie beginnen

Lesen Sie 2%

6 % lesen

12% lesen

15 % lesen

Jeder...

EA meldet "Nicht genug Speicher(4007 Mb verwendet, 88 Mb verfügbar, 4095 Mb insgesamt)!!!".

Und das sind nur 15,3 % des erforderlichen Betrags (und ich möchte ihn auch in Zukunft erhöhen).


Option 2 - jedes Mal die Datei lesen. Suchen Sie das benötigte Stück, speichern Sie es in der Struktur, lesen Sie das nächste Stück, vergleichen Sie das Ergebnis, überschreiben Sie die Struktur.

Und wenn ich diese Sequenzen einmal durchgehen müsste, würde ich genau das tun. Aber man muss sie viele Male durchgehen und sich jedes Mal ein Stück weiterbewegen.

Man muss also sehr oft lesen, was das ist:

  • sehr, sehr langsam.
  • Abwischen eines Lochs in der Schraube.
Ich bin nicht sicher, ob ich bereit bin, ein paar Tage auf die Ergebnisse zu warten...

Es ist auch frustrierend, wie viele Informationen es gibt... Wenn es 10 GiG wären, würde ich es auf die RAM-Disk verschieben (tatsächlich in den Speicher) und so viel lesen, wie ich kann. Ja?

Das ist alles, was mir einfällt.

Versuchen Sie, diese Sequenzen neu zu kompilieren, so dass es viele, viele Teile gibt, die aber jeweils nur die im Moment notwendigen Informationen enthalten?

Versuchen Sie auch, die Daten zu komprimieren (ich habe bereits überall, wo ich kann, auf Floats mit Char-Typen umgestellt)? Aber damit bekomme ich höchstens 10%-20% mehr, und ich muss das Volumen um eine Größenordnung reduzieren...

Habt ihr einen Rat, Freunde? Ich gehe ran)

 

komposter:

Habt ihr einen Rat, Freunde? Ich kümmere mich darum.)

Als Optionen...

1. einen eigenen Cache einrichten. In diesem Fall haben Sie die Kontrolle darüber, was sich im Speicher befindet. Sie kennen den Algorithmus, so dass Sie den Cache effizient gestalten können.

2. verwenden Sie eine Zuordnung für die Datei. Wind wird das, was es braucht, zwischenspeichern und die Festplatte nicht löschen.

 
TheXpert:

Als Optionen...

1. einen eigenen Cache einrichten: In diesem Fall können Sie den gesamten Inhalt selbst verwalten.

2. Verwenden Sie ein Mapping für die Datei. vin selbst wird die benötigten Daten zwischenspeichern, so dass sie die Festplatte nicht überschreiben.

1. Dies ist der Cache... Oder ich verstehe nicht, was Sie meinen. Meine Option, ständig die notwendigen Abschnitte zu lesen?

2. Können Sie das etwas näher erläutern? Was soll mit der Kartierung erreicht werden und wie kann man sie angehen?

 
Ich fange an, das Mapping in den Griff zu bekommen. Ich werde mehr Mana studieren und dann in die Minen gehen.)
 

Oh, Scheiße...

32-битные архитектуры (Intel 386, ARM 9) не могут создавать отображения длиной более 4 Гб

Dieselben Eier, aber von der Seite. Das Lesen mag zwar schneller gehen, löst das Problem aber nicht global.

 

Eine andere Idee ist, alles in eine Datenbank (MySQL?) zu verschieben und damit zu arbeiten. Die Idee ist, dass Datenbanken für solche Mengen und ständiges Graben ausgelegt sind.

Gibt es irgendwelche Experten? Wer hat etwas zu sagen?

 

1) Gibt es eine Möglichkeit, den Algorithmus zu überarbeiten? Einen Block (2 GB) laden, verarbeiten, das Ergebnis speichern (kürzer), Speicher freigeben, den nächsten Block laden ...

und verarbeiten Sie am Ende alle Ergebnisse noch einmal.

2) Wenn es viel Arbeit mit dem Speicher gibt, sind Hash-basierte Lösungen, B-Bäume (und ihre Änderungen), Offload auf die Datenbank verbunden.

 
ALXIMIKS:

1) Gibt es eine Möglichkeit, den Algorithmus zu überarbeiten? Einen Block (2 GB) laden, verarbeiten, das Ergebnis (kürzer) speichern, den Speicher freigeben, den nächsten Block laden ...

und verarbeiten Sie am Ende alle Ergebnisse noch einmal.

2) Wenn es viel Arbeit mit dem Speicher gibt, sind Hash-basierte Lösungen, B-Bäume (und ihre Änderungen), Offloading auf die Datenbank verbunden.

1. ich habe darüber geschrieben - man kann es, aber das Problem ist, dass man die Daten mehrfach verarbeiten muss. Es wird sehr langsam sein.

2. Morgen werde ich mich selbst googeln, ich werde für eine kurze Beschreibung dankbar sein.

 
komposter:

1. ich habe darüber geschrieben - das kann man, aber das Problem ist, dass man die Daten viele Male verarbeiten muss. Das wäre sehr langsam.

2. Morgen werde ich mich selbst googeln, ich wäre für eine kurze Beschreibung dankbar.

Ich erinnerte mich an eine Website, auf der ein ähnliches Problem und Varianten seiner Lösung in C++ diskutiert wurden.

Отсортировать строки в файле размером 3GB | FulcrumWeb
Отсортировать строки в файле размером 3GB | FulcrumWeb
  • www.fulcrumweb.com.ua
Необходимо написать алгоритм, который бы смог отсортировать строки в файле большого размера (от 2-х до 4-х Gigabytes). Результатом выполнения должен быть другой файл. За хорошую реализацию гарантированный приз – флешка для хранения таких файлов и, возможно, предложение работы в нашей компании.
 
Es tut mir leid, aber was, wenn Sie versuchen, 64 Bit oder mt läuft nur 32
Ich war naiv zu glauben, dass so eine hochmathematische Sache auf 64 Bit laufen sollte.
Nehmen Sie die aerodynamischen Berechnungen für Flugzeuge, sie funktionieren überhaupt nicht auf 32x
das Grundargument, dass 32x schneller ist, um die Maschine zu betreiben, kenne ich, aber es ist wirklich ein Hardware-Problem imho
 

1. Natürlich sollten Sie ein x64-System verwenden.

2. einen leistungsfähigeren Rechner in der Amazon EC2-Cloud mieten und die Berechnungen darauf durchführen.

3. Verwendung komprimierter Daten, Dekomprimierung im Speicher bei laufendem Betrieb. Reale Daten lassen sich besser komprimieren, wenn man sie in Streams (Vorzeichen/Mantisse/Exponent) aufteilt; man kann 12-Bit-Float verwenden (auf Kosten der Genauigkeit).

4. eine Berechnung mit einem Programm durchführen, das große Datenmengen verarbeiten kann (Matlab/R/etc).