AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datei > 500mb vollständig in RAM laden

Ein Thema von Harry M. · begonnen am 2. Jul 2007 · letzter Beitrag vom 3. Jul 2007
Antwort Antwort
Seite 3 von 3     123   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#21

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

  Alt 2. Jul 2007, 17:52
[quote="Elvis"]
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#22

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

  Alt 2. Jul 2007, 17:59
Als weitere Alternative wären "external files" zu nennen.
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#23

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

  Alt 2. Jul 2007, 18:36
Zitat von mkinzler:
Als weitere Alternative wären "external files" zu nennen.
Was meinst Du damit?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#24

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

  Alt 2. Jul 2007, 18:41
Das ist eine Funktion von IB/FB, bei der man Textdateien als Tabelle ansprechen kann.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#25

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

  Alt 2. Jul 2007, 21:02
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.
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#26

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

  Alt 2. Jul 2007, 23:05
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 von Harry M.:
Ich denke ein DBMS komprimiert glichzeit.
Nein, denn das kostet Zeit.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#27

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

  Alt 2. Jul 2007, 23:16
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.

Habe die Benachrichtigung mal sicherheitshalber ausgeschalten und packe mir auch gleich meinen Asbestanzug aus
  Mit Zitat antworten Zitat
DelphiProgrammierer

Registriert seit: 11. Apr 2007
67 Beiträge
 
Delphi 2007 Professional
 
#28

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

  Alt 3. Jul 2007, 07:33
Ich möchte ergänzen, dass es auch den T-SQL-Befehl BULK INSERT gibt, mit dem man eine Datei importieren kann.


Zitat von alzaimar:
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.
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