![]() |
Datei > 500mb vollständig in RAM laden
Moinsen DP
Wie bekomme ich meine Datei möglichst schnell in den RAM um sie dort wie ein TFielStream oder TMemoryStream zubehandeln. Den fs öffnen un in einen ms kopieren, scheint mir nicht der richtige Weg. (Hat zu lange gedauert - ein víelfaches länger als sie einfach nur zukopieren, und nachdem immer noch nicht fertig geladen wurde aber schon viel mehr Speicher drauf ging, habe ich die Sache abgebrochen.) Aber vielleicht lags auch nur am Code :gruebel:
Delphi-Quellcode:
Weiß doch sicher wieder jemand bescheid?! :mrgreen:
function LoadTable(AFileName: String; var AResult: TMemoryStream): Boolean; overload;
var fs: TFileStream; begin Result := False; if FileExists(AFileName) then begin fs := TFileStream.Create(AFileName, fmOpenRead); AResult := TMemoryStream.Create; AResult.CopyFrom(fs, fs.size); fs.Free; Result := AResult.Size > 0; end; end; |
Re: Datei > 500mb vollständig in RAM laden
Hi Harry,
mach doch direkt ein MS.LoadFromFile ;-) [edit]Wobei ich keinen Sinn dabei sehe, eine komplette 500mb Datei in den Ram zu laden. Was hast Du den vor? Vielleicht geht das auch anders. [/edit] |
Re: Datei > 500mb vollständig in RAM laden
Wie wäre es denn mit sog. "MemoryMapped Files" und die restliche Arbeit dem OS überlassen?
|
Re: Datei > 500mb vollständig in RAM laden
Äffffffffffffff. Genau das hab ich gestern gesucht und nich gefunden. :wall: :wall: :wall:
Danke. |
Re: Datei > 500mb vollständig in RAM laden
Hi Daniel,
MemoryMapped Files - gutes Stichwort. Da guck ich doch ma nach :mrgreen: Edit: Ich versuch grad so ne Art Datenbank zubauen. Ohne dabei wirklich auch ADO und Co zusetzten. Denn bei Test ist mir aufgefallen, mit zunehmender Grösse sank auch die Performance der SQL anfragen rapiede Schon nach 15 Min inserst bei anlegen, kamem Zeiten > 200ms raus, was nicht akzeptabel ist. Ich schreibe jetzte meine Daten zuerst in den Speicher und sicher dort aller paar Minuten in eine Datei. Das geht besser. |
Re: Datei > 500mb vollständig in RAM laden
Zitat:
Gruß Der Unwissende |
Re: Datei > 500mb vollständig in RAM laden
Zitat:
|
Re: Datei > 500mb vollständig in RAM laden
Und bei einem 512 MB System bleiben dann noch 12 MB für Betriebssystem und dein Programm (das keine anderen Programme noch nebenbei laufen, habe ich gleich mal außen vor gelassen, da sehr unwahrscheinlich ist, dass man die noch gestartet bekommt bzw. vernünftig mit arbeiten kann). Selbst auf einem 1 GB System macht es nicht wirklich Freund zu arbeiten, wenn plötzlich die Hälfte vom Speicher fehlt.
Das die Performance in den Keller geht, wenn ich jedes Byte einzeln lade, dürfte irgendwie logisch sein. Arbeite mit einem entsprechenden Lesepuffer (512 KB) und du solltest auch keine Performance-Probleme haben. |
Re: Datei > 500mb vollständig in RAM laden
Zitat:
[edit] roter Kastern?! Aber gleich eine Ergänzung, wie Luckie schon sagte, wirst Du schnell das Problem bekommen, dass Dir das OS schon gar nicht den gesamten RAM zur Verfügung stellen wird, es muss ja selbst auch noch laufen! Wenn sich dann 512 MByte noch potenzieren landest Du schnell bei den Grenzen eines 32-Bit Systems. [/edit] |
Re: Datei > 500mb vollständig in RAM laden
Zitat:
Diese doch sehr fundamentale Wissenslücke sollte dich eigentlich auf den Gedanken bringen, dass du dich a) nicht mit genügend unterschiedlichen DBMS auseinandergesetzt hast und das Ganze b) nicht lange genug (Erfahrung). Jeder (JEDER) Versuch ein eigenes, auf eine spezielle App angepasstes, DBMS zu basteln, der mir bisher unter die Augen kam, war bestenfalls jämmerlich. Zitat:
Zitat:
Alles Dinge, die dir Firebird oder SQLite abnehmen würden, und beide machen diesen Job sehr gut. ;) |
Re: Datei > 500mb vollständig in RAM laden
Jo stimmt. Ich hab mich nicht lange genug mit den verschienden DBMS System auseinander gesetzt.
Wieviele davon gibt es? Und wieviel zeit bräucht ich um mich mit gründlich einzuarbeiten? Um dann auch noch das Beste für mich herraus zussuchen. Ich werde Deine Hinweise berücksichtigen und schaue ob ich mit Firebird besseres Ergebnisse erziele. Die potenzierung erfogt natürlich geteilt. zB auf 1 GB pro Datei. [AM_RANDE] Bei 1 TB local zu Verfügung könnte ich auch einiges aufnehmen. Desweiten habe 2 Gb drinne, noch eine Bank frei, und noch aufrüstbar dank 64MB Grafik (muss aber erst warten wegen dem neuen DualChanel fähigen Bord) Falls das jemand wissen mag. :mrgreen: [/AM_RANDE] Sicherlich wird es nur ein kläglicher Versuch bleiben wenn ich es gegen ein "ordentliches" DBMS vergleiche. Ist auch ehr nur der als Station auf dem Weg zu der Erfahrung gedacht, von der Du sprichst. |
Re: Datei > 500mb vollständig in RAM laden
Selbst wenn man auf ein DBMS verzichten will, würde ich nie auf die Idee kommen, die komplette "Datenbank" im Speicher zu halten. in diesem Fall würde ich nur den Index (als Binärbaum o.ä.) im Speicher halten, welcher dann auf die Recordnummern in der Datei verweist. Diese würden sequentiell geschrieben und ein Ordnung nur per Index erreicht, welcher zusätzlich zum Speicher spätestens beim beenden des Programmes auf Platte gesichert werden sollte.
Aber ich sehe es wie Elvis: Ein solche Lösung würde viel mehr Arbeit als die Einarbeitung in ein DBMS bedeuten und wohl nicht ansatzweise an die Performance herankommen. |
Re: Datei > 500mb vollständig in RAM laden
Ist meine Idee im Hinterkopf. :zwinker:
nur ist mir noch nicht ganz klar wie ich so einen Index machen könnte. Muss ja am Ende auf eine mathematische Formel beruhen.... und wenn die dann halbwegs funzen sollte. werde ich die Dateien sicher nicht mehr im Ram halten. Wo sie ohne hin nur geladen werden wenn Sie gebraucht würden. |
Re: Datei > 500mb vollständig in RAM laden
Als Index würde sich ein Binärbaum eigenen (dieses Problem hat wohl fast jeder hier in der Schule/Uni usw schon mal Lösen dürfen)
|
Re: Datei > 500mb vollständig in RAM laden
Dann sollte sich da ja was finden lassen (läuft ja auch grad noch ein Thread zu dem Thema)
|
Re: Datei > 500mb vollständig in RAM laden
Zitat:
Ein DBS macht aber eine ganze Menge mehr, da gibt es gleich einen Cache mit Datensätzen, auf die (vermutlich) demnächst zugegriffen wird. Das heißt, dass nicht die ganze Datei, aber relevante Teile schon im RAM landen. Die benötigte Verdrängungsstrategie, die Datensicherheit, Transaktionen uvm. bringen die meisten (zumindestens die bekannten) dann auch gleich mit. Da kann auf DB2, Oracle, PostgreSql, MySql, MsSql und natürlich Firebird verwiesen werden. Die dürften alle besser skalieren, schneller/effizienter arbeiten, mehr Konsistenz und Sicherheit garantieren als es eine eigene Lösung tut! Da arbeiten einfach viele Leute seit einem Weilchen dran, allein die Nebenläufigkeit dürfte schon ein hartes Stück Arbeit für eine Person sein! Es macht einfach keinen Sinn auf diese (guten!) Lösungen zu gunsten einer eigenen zu verzichten (und sorry, schon gar nicht wenn man dazu einfach versucht alles im Speicher zu halten!). |
Re: Datei > 500mb vollständig in RAM laden
Ich geb Dir durchweg Recht, Du angeblich Unwissender :lol:
|
Re: Datei > 500mb vollständig in RAM laden
Zitat:
|
Re: Datei > 500mb vollständig in RAM laden
Zitat:
Klar, ein DBS lädt eben nicht nur den Index in den Speicher, sondern hält auch einzelne Seiten vor, aber das ist ja nicht gerade ein Nachteil. Anders gesagt, wenn man die Funktionalität eines DBS benötigt/nutzen will (und so habe ich Harry M. verstanden), dann ist es manchmal das klügste zu einem DBS zu greifen :wink: |
Re: Datei > 500mb vollständig in RAM laden
Zitat:
![]() Zitat:
|
Re: Datei > 500mb vollständig in RAM laden
[quote="Elvis"]
Zitat:
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. |
Re: Datei > 500mb vollständig in RAM laden
Als weitere Alternative wären "external files" zu nennen.
|
Re: Datei > 500mb vollständig in RAM laden
Zitat:
|
Re: Datei > 500mb vollständig in RAM laden
Das ist eine Funktion von IB/FB, bei der man Textdateien als Tabelle ansprechen kann.
|
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. |
Re: Datei > 500mb vollständig in RAM laden
Zitat:
Zitat:
Zitat:
|
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):
![]() 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: |
Re: Datei > 500mb vollständig in RAM laden
Ich möchte ergänzen, dass es auch den T-SQL-Befehl
![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz