AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

Ein Thema von bogdan · begonnen am 7. Feb 2021 · letzter Beitrag vom 8. Feb 2021
Antwort Antwort
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#1

Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 15:30
Datenbank: MySQL • Version: 5.7.16 • Zugriff über: FireDac
Hallo,

mit meinem Programm werden ca. 10.000.000 Daten aus einer MySQL Daten geladen und ausgewertet. Der RAM der Instanz explodiert dann auf ca. 3-4 GB.

Ab und zu brauche ich eine 2. und 3. Instanz, die auf die gleichen Daten zugreift und auswertet. Somit laufen dann 3 Instanzen, die 9-12 GB an RAM verbrauchen.

Wäre es möglich die MySQL Daten einmal in den RAM zu laden und die drei Instanzen greifen darauf zu ohne dass jede einzelne Instanz für sich die Daten in den RAM lädt?

Vielen Dank für eure Ideen

Geändert von bogdan ( 7. Feb 2021 um 15:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 16:43
Wäre möglich, zum Beispiel indem du ein interface über TCP (oder gleich HTTP) realisierst, sodass die eine Instanz die Daten teilt.

Die Frage sei aber erlaubt: Warum möchtest du eine DB nachprogrammieren? Du könntest einfach nicht alle Daten auf einmal laden (in der ersten Instanz) und dann jedes Programm auf dieselbe DB verweisen.
Falls die DB remote ist: Daten einmal lokal klonen und dann lokal einen DB Server aufmachen, auf den alle drei Anwendungen zugreifen.
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#3

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 17:04
Eine DB nachprogrammieren möchte ich nicht.

Die Daten auf 3 Instanzen zu verteilen ist leider nicht möglich, das ausgewertete Ergebnis wäre dann falsch.

Jede Instanz hat für sich exclusive Kriterien, mit dennen die Daten ausgewertet werden. Besipiel:

1. Instanz hat die Kriterien a+b+c und wertet die Daten aus.
2. Instant hat die Kriterien d+e+f und wertet die Daten aus.
3. Instant hat die Kriterien g+h+i und wertet die Daten aus.

Es handelt sich aber immer um die gleichen ca. 10.000.000 Daten, die jede Instanz für sich in den RAM lädt. Ich dachte das könnte ich irgendwie anderst lösen, damit der Arbeitsspeicher nicht so sehr belastet wird.

Natürlich könnte man die Daten in kleinere Gruppen laden, aber das Prinzip wäre immer noch gleich. 3x die gleichen Datensätze im RAM.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 18:00
Ich weiß jetzt nicht was genau du mit 3 Instanzen meinst. Handelt es sich um ein Programm?
Evtl. wäre ein ClientDataSet() das Mittel der Wahl?
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#5

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 18:03
Momentan klingt das so, als würdest Du 3 mal alle Daten laden, um sie dann programmatisch auszuwerten.

Das ist für mich "eine Datenbank" nachprogrammieren!

Wenn es Auswahlkriterien gibt, dann kämen die bei mir (möglichst stark einschränkend, also die kleinstmögliche Ergebnismenge liefernd, die für die Erledigung der übrigen Auswertung zwingend erforderlich ist) in die jeweilige Where-Bedingung.

Also quasi:

1. Instanz hat die Kriterien a+b+c und wertet die Daten aus. -> select * from Tabelle where kriterien = a+b+c
2. Instant hat die Kriterien d+e+f und wertet die Daten aus. -> select * from Tabelle where kriterien = d+e+f
3. Instant hat die Kriterien g+h+i und wertet die Daten aus. -> select * from Tabelle where kriterien = g+h+i

aber keinesfall 3 mal -> select * from Tabelle

(Tabelle steht hier für einen beliebig einfachen oder beliebig komplexen Join über x Tabellen, der Stern für die minimal erforderlichen Spalten dieser Abfrage. Was nicht im Programm benötigt wird, kommt (bei mir grundsätzlich) auch nicht in die Spaltenauswahl des Selects - spart ggfls. gigantische Mengen an Speicher.)

Die Stärke von Datenbanken ist ja nicht nur "Unmengen von Daten" vorhalten zu können, sondern eben auch derern gezielte Auswertung.

Programmatisch werte ich nur das aus, von dem definitiv feststeht, dass es mit Datenbankmitteln nicht auswertbar ist.

Ist mir in den letzten ca. 20 Jahren nicht mehr passiert

Um Deine Frage genauer beantworten zu können und ggfls Abhilfe beim bestehenden Problem geben zu können, müsstest Du die Aufgabenstellung bitte etwas präzisieren.

10.000.000 Datensätze und die von Dir genannte Art von Kriterien alleine reicht nicht aus, um zu dem Schluss kommen zu können: Die Auswertung ist nicht durch die Datenbank durchführbar, alle Daten müssen programmatisch außerhalb der Datenbank ausgewertet werden.

Was ebenfalls unklar ist: Gibt es drei MySQL-Instanzen, die jeweils 3-4 GB benötigen

oder

benötigen drei Instanzen Deines Programmes jeweils 3-4 GB Speicher?
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#6

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 18:41
Delphi.Narium:

Es ist leider so, dass die Daten nur programmatisch außerhalb der Datenbank ausgewertet werden können.

Auf dem firmen internen Windows Server ist MySQL Workbench installiert.
Es existieren mehrere Datenbanken.
Eine davon hat über 50.000.000 Datensätze.

Auf einem der Arbeitsplatz Laptops ist mein Programm installiert, welche die Daten auswerten muss.

1. Das Programm erzeugt eine SELECT + JOIN Abfrage und holt die Daten aus der MySQL Datenbank. Das Ergebnis reduziert sich auf ca. 10.000.000 Datensätze und wird in den RAM geladen (3-4 GB)

2. Dann werden die Daten mit dem Programm unter verschiedenen Kriterien/Vorgaben ausgewertet. Mit der MySQL Synthax geht das leider nicht.

Es werden sehr viele Kriterien/Vorgaben im Programm erzeugt und in diverser Abhängigkeit die 10.000.000 Daten ausgewertet.

Erzeuge Kriterium 1: a+b+c ---> dann werte die Daten aus
Erzeuge Kriterium 2: b+c+d ---> dann werte die Daten aus
Erzeuge Kriterium 3: a+b+d ---> dann werte die Daten aus
usw.

Hier tummeln sich einige Schleifen, die programmatisch diverse Kriterien erzeugen und bei jeder Änderung müssen alle 10.000.000 Daten von vorne ausgewertet werden.

Um das ganze zu beschleunigen habe ich 3x mein Programm gestartet und die Kriterien verteilt, damit das ganze zügiger abläuft.

Aber um die Daten auszuwerten muss ich diese ja erst mal in das Programm laden (also in den RAM) und dann erzeugen 3x geöffnete Programme mit je 10.000.000 Daten 9-12 GB RAM-Belastung.

juergen
Müsste ich mir anschauen.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 19:03
Die Frage war etwas zugespitzt, aber ich sehe es als Aufgabe einer DB, Daten zu halten und verfügbar zu machen. Insofern ist die Frage "wie mache ich 4Gb an Daten für Anwendungen auf meinem PC verfügbar?" Einfach: "Tu sie in eine Datenbank"

Nachdem das Problem inzwischen besser umrissen ist, würde ich 2 Alternativen sehen:

- Zieh die relevanten Datensätze in eine lokale Datenbank. Dann hast du die 4Gb erstmal nur auf der Platte. Die 3 Instanzen können relativ schnell und latenzarm jeden Datensatz lesen
- Lagere die Auswertung nicht in 3 Prozesse sondern ind 3 Thread aus. Solange alle Zugriffe auf die 4GB Daten nur lesend erfolgen, brauchst du auch nix synchronisieren. Du kannst auch einfach jedes Kriterium als eigenen Task anlegen und den Threadpool nutzen. Dann kannst du auch eine moderne 8 Kern CPU auslasten.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
458 Beiträge
 
#8

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 7. Feb 2021, 21:32
Wenn du dir eine lokale SQLite Datenbank anlegst, benötigt das bei 10M Datensätzen etwas Zeit. Selbst mit dem lightning-fast schnellen Framework mORMot, erreichst du vielleicht 100-150K Rows/Second. Siehe den mORMot ORM Benchmark hier. Die Zeit, die du zur Auswertung zur Verfügung hast, sollte dein Vorgehen bestimmen. Wenn 1,5 Minuten zum Zwischenspeichern der Daten kein Problem sind, ist die Verwendung einer lokalen DB, wie die Vorposter schon geschrieben haben, der einfachste Weg.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#9

AW: Zugriff auf MySql Daten im RAM von mehreren Instanzen möglich?

  Alt 8. Feb 2021, 08:31
jfheins

Hmmm, das werde ich mal ausprobieren.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:46 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