Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datei > 500mb vollständig in RAM laden (https://www.delphipraxis.net/95160-datei-500mb-vollstaendig-ram-laden.html)

alzaimar 2. Jul 2007 16:52

Re: Datei > 500mb vollständig in RAM laden
 
[quote="Elvis"]
Zitat:

Zitat von Harry M.
Jeder (JEDER) Versuch ein eigenes, auf eine spezielle App angepasstes, DBMS zu basteln, der mir bisher unter die Augen kam, war bestenfalls jämmerlich.

Also ich hab mal eine B-Tree-Implementierung zusammengebaut, die ca. 500.000 Schlüssel/Wert-Paare (Schlüssel=String[8], Wert = 64 Byte) speichern und auf der Platte ablegen konnte. Das kann keine richtige DB. Es geht also, wenn man will (War im Rahmen einer Messdatenerfassung von einem CAN-Bus. Der Schlüssel enthielt dabei u.a. Zeit und Kanal-Nummer).

Es gibt mehrere Möglichkeiten, Daten sehr schnell in einem richtigen DBMS abzulegen. Da ich MSSQL verbunden bin, kann ich nur für diese DB sprechen:

Möglichkeit 1 (geht vermutlich für alle DB).
Du sammelst die INSERT-Anweisungen in einem String, bis dieser max. 1000 Zeichen lang ist und bläst diese über die Execute-Methode der ADO-Connection zur DB.

Möglichkeit 2: Du verwendest BCP.EXE (Bluk Copy Program) von Microsoft. Das ist bei jedem Server dabei. Es handelt sich um ein Kommandozeilentool, das speziell formatierte Textdateien sehr schnell (>10000 Recs per second) reinsaugt.

Ich würde #2 nehmen und nur wenn du wirklich Performance brauchst, eine selbstgefrickelte Lösung implementieren. Diese B-Tree-Geschichte war nicht Ohne.

mkinzler 2. Jul 2007 16:59

Re: Datei > 500mb vollständig in RAM laden
 
Als weitere Alternative wären "external files" zu nennen.

alzaimar 2. Jul 2007 17:36

Re: Datei > 500mb vollständig in RAM laden
 
Zitat:

Zitat von mkinzler
Als weitere Alternative wären "external files" zu nennen.

Was meinst Du damit?

mkinzler 2. Jul 2007 17:41

Re: Datei > 500mb vollständig in RAM laden
 
Das ist eine Funktion von IB/FB, bei der man Textdateien als Tabelle ansprechen kann.

Harry M. 2. Jul 2007 20:02

Re: Datei > 500mb vollständig in RAM laden
 
:mrgreen: Für local Aktionen scheint mir die Sache mit dem Commandozeilentool geeignet. Passt aber nich zum EndZiel meiner Idee.

Ich habe vor Clienten zu einem Server connecten zu lassen, sich dort einen "job" geben zu lassen, diesen berechenen und das Ergebniss zurück zum Server zuschicken. Jetzt greifen mehrere Clienten (mehr oder weniger) gleichzeitig auf den Server holen sich ihre Jobs und tragen die Resulte ein.

Der weg über ADO und eigene FileStreams ist alles nicht passend, hab ich festgestellt wegen der anfallden Datenmege. Also suche ich nach einer Leistungstarken DBMS. Ich denke ein DBMS komprimiert glichzeit. Ich gucke mir grade sie Sache mit IB/FB an. Um ein bisschen mehr Erfahrung zukriegen.

alzaimar 2. Jul 2007 22:05

Re: Datei > 500mb vollständig in RAM laden
 
Zitat:

Zitat von Harry M.
Für local Aktionen scheint mir die Sache mit dem Commandozeilentool geeignet.

bcp.exe (für MSSQL) schiebt die Daten zum Server und passt auf Deine Anwendung. Man kann ja so ein Tool vom Programm aus aufrufen.

Zitat:

Zitat von Harry M.
Ich denke ein DBMS komprimiert glichzeit.

Nein, denn das kostet Zeit.

Zitat:

Zitat von Harry M.
Ich gucke mir grade sie Sache mit IB/FB an. Um ein bisschen mehr Erfahrung zukriegen.

Eine gute Wahl. Klein, kompakt, stark, schnell.

Olli 2. Jul 2007 22:16

Re: Datei > 500mb vollständig in RAM laden
 
Es gibt da ein tolles Buch zum effizienten Umgang mit großen Datenmengen (und anderen tollen Dingen): http://www.cs.bell-labs.com/cm/cs/pearls/

Im Übrigen würde selbst bei 1GiB RAM mit höchster Wahrscheinlichkeit nie die gesamte Datei im Speicher landen. Gut, indirekt in den FS-Cache vielleicht, aber sicher nicht im residenten Speicher der Anwendung. :mrgreen: :mrgreen: :mrgreen:

Habe die Benachrichtigung mal sicherheitshalber ausgeschalten und packe mir auch gleich meinen Asbestanzug aus :stupid:

DelphiProgrammierer 3. Jul 2007 06:33

Re: Datei > 500mb vollständig in RAM laden
 
Ich möchte ergänzen, dass es auch den T-SQL-Befehl BULK INSERT gibt, mit dem man eine Datei importieren kann.


Zitat:

Zitat von alzaimar
Zitat:

Zitat von Harry M.
Jeder (JEDER) Versuch ein eigenes, auf eine spezielle App angepasstes, DBMS zu basteln, der mir bisher unter die Augen kam, war bestenfalls jämmerlich.

Also ich hab mal eine B-Tree-Implementierung zusammengebaut, die ca. 500.000 Schlüssel/Wert-Paare (Schlüssel=String[8], Wert = 64 Byte) speichern und auf der Platte ablegen konnte. Das kann keine richtige DB. Es geht also, wenn man will (War im Rahmen einer Messdatenerfassung von einem CAN-Bus. Der Schlüssel enthielt dabei u.a. Zeit und Kanal-Nummer).

Es gibt mehrere Möglichkeiten, Daten sehr schnell in einem richtigen DBMS abzulegen. Da ich MSSQL verbunden bin, kann ich nur für diese DB sprechen:

Möglichkeit 1 (geht vermutlich für alle DB).
Du sammelst die INSERT-Anweisungen in einem String, bis dieser max. 1000 Zeichen lang ist und bläst diese über die Execute-Methode der ADO-Connection zur DB.

Möglichkeit 2: Du verwendest BCP.EXE (Bluk Copy Program) von Microsoft. Das ist bei jedem Server dabei. Es handelt sich um ein Kommandozeilentool, das speziell formatierte Textdateien sehr schnell (>10000 Recs per second) reinsaugt.

Ich würde #2 nehmen und nur wenn du wirklich Performance brauchst, eine selbstgefrickelte Lösung implementieren. Diese B-Tree-Geschichte war nicht Ohne.



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz