• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Server Sparsam Programmieren

Lapura

Kuhfänger
Registriert
28 Dezember 2014
Beiträge
73
Alter
26
Diamanten
314
Hey, ich wollte mal nachfragen wie ihr so Stats abspeichert, und das so Sparsam wie möglich,
ich will bitte auf .yml bleiben, ich weiß das MySQl, oder NoSQl Datenbanken um einiges besser sind,
aber ich möchte dennoch .yml Datein nutzen!
Ich denke mal ihr macht das mit HashMaps, und speichert diese beim Enable und speichern bei Disable?
Bitte sagt mir wie es am besten ist das wirklich keine Lags entstehen, und falls ihr Tricks habt
wie ich lags allgemein mit .yml verhinden kann, bitte auch bescheid sagen!

Liebe Grüße, Lukas
(Lukas / 18 eigentlich 12 FeelPvP Owner)
 

Baba43

Ehem. Teammitglied
Ehem. Teammitglied
Registriert
5 November 2012
Beiträge
869
Diamanten
60
Minecraft
baba43
Am besten erklärst du einmal, wieso du unbedingt *.yml Dateien nutzen möchtest?

Du hast bei Dateien ein einfaches Problem: dein Server kann jederzeit abstürzen und je nach dem, wie wichtig deine Daten sind, werden Änderungen dann nicht mehr gespeichert. Der Kompromiss dazu wäre, die Dateien einfach so zwischendurch zu speichern.

Ich weiß nicht, was du mit deinem Plugin vor hast, aber du wirst mit dem Ansatz spätestens dann auf die Klappe fliegen, wenn du mehr als einen Server hast und dieser die Informationen teilen soll. Dann wirst du am eigenen Leibe erfahren, wieso mittlerweile die meisten Plugins auf zentrale Speichermöglichkeiten zurückgreifen.

Lags kann und sollte man übrigens erst dann verhindern, wenn sie da sind. Die Verwendung einer falschen Datenstruktur wird mit Sicherheit dein kleinstes Problem bei deinem Minecraft-Server sein.
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
YML-Dateien sind in jedem Fall der falsche Ansatz. Wenn du dort z.B. Spielstatistiken speichern möchtest, dann wirst du jedes Mal einen Haufen Dateien öffnen und speichern müssen. Bei einer halbwegs sinnvollen Speicherung müsstest du für jede einzelne Spielrunde und jeden einzelnen Spieler eine Datei anlegen. Zusätzlich kämen hier noch kumulierte Daten für Toplisten in Frage.
Bei Dateien musst du selber dafür sorgen, dass Daten konsistent sind. Hier insbesondere wie bereits im Beitrag zuvor erwähnt bei mehreren gleichzeitig laufenden Servern. Bei Datenbanken wird diese Konsistenz durch Transaktionen automatisch erreicht. Datenbanken sind bei sinnvollen Indizes sehr schnell bei Zusammenfassen von Daten. Bei YAML-Dateien müsstest du unter Umständen alle Dateien durchgehen. Datenbanken lassen sich sehr einfach durch Webanwendungen auslesen, bei YAML-Dateien ist dies deutlich komplizierter und verzögert den Webseitenaufbau erheblich. Wenn du Datenbankabfragen asynchron machst, dann entstehen wirklich keine Lags. Die Daten liest und schreibst du einfach je nach Bedarf und nicht bei onEnable und onDisable.

Ich kann mir tatsächlich auch keinen einzigen Vorteil von YAML-Dateien vorstellen.
 
F

Figz

Guest
Eine Datenbank ist für deine Zwecke sicherlich eher von Nutzen. Denn Datenbanken sind genau dafür ausgelegt und programmiert worden, Daten zu speichern und diese bei Bedarf so schnell wie möglich bereitzustellen. Dadruch, dass du ein Dateisystem wie YAML verwenden möchtest, wird dein Server anfälliger für Laggs.

Wenn du aber einfach keine Lust hast ein Datenbanksystem zu installieren oder es für deinen Zweck doch zu viel ist, dann würde ich dir SQLite empfehlen (ich hoffe ich sage da jetzt nix falsches).
 
Zuletzt bearbeitet von einem Moderator:

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Mit einer Datenbank laggt das natürlich genau so. Die IO Operation darf nicht im Haupthread erfolgen und dann ist es auch wieder egal ob er YML oder MySQL nimmt. Ein Dateisystem nutzt übrigens ähnliche Strukturen wie eine Datenbank. Die Datenbank lohnt sich daher erst, wenn man Abfragen machen möchte. Der Schlüssel zur Frage ist aber asynchrones IO.
 
Zuletzt bearbeitet:
F

Figz

Guest
Mit einer Datenbank laggt das natürlich genau so. Die IO Operation darf nicht im Haupthread erfolgen und dann ist es auch wieder egal ob er YML oder MySQL nimmt. Ein Dateisystem nutzt übrigens ähnliche Strukturen wie eine Datenbank. Die Datenbank lohnt sich daher erst, wenn man Abfragen machen möchte. Der Schlüssel zur Frage ist aber asynchrones IO.

Dann poste Ihm hier doch bitte ein gaanz kleines Beispiel wie async. IO funktioniert. (Bitte als Java-Code)

-> Damit du nicht viel nachdenken musst: Kills aus einer .yml Datei auslesen zu einem Spieler
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Wofür ein Beispiel? Wie funktioniert denn synchrones IO? Genau wie asynchrones, außer dass man zum schreiben einen Buffer nutzen sollte
und man halt lesen und schreiben auf einen anderen Thread auslagert.

(Beispiel zum schreiben):
//WriteOrder muss selbst erstellt werden, es benötigt lediglich die Datei in die zu schreiben ist und was zu schreiben ist.
ArrayList<WriteOrder > buf = ArrayList<WriteOrder >();

//Kann überall auferufen weren und fügt einen Schreib auftrag zum buffer hinzu
public static void addToBuf(WriteOrder order){
buf.add(order);
}

//Wird von einem anderem Thread aufgerufen, ist jedem selbst überlassen ob er den ganzen buffer schreiben möchte oder nur das 1. element.
//Alternativ kann auch ein boolean genutzt werden der den anderen thread informiert dass diese methode aufgerufen wird, dann ist die sache //mit der thread sicherheit jedoch etwas problematischer. (Hier zwar auch hat bei mir aber auch ohne vorkehrungen perfekt funktioniert.)
public static void writeFromBuf(){
//Schreiben und element aus dem buffer entfernen
}

Edit auslesen kann man ähnlich machen. Dann sollte jedoch wenn man es vernünftig und für alle datentypen machen möchte auch verschiedene lese methoden für die typen geben.
Und eine globale variable genutzt werden. Natührlich muss dann der "Auftrag" zum auslesen erteilt werden bevor die variable benötigt wird, und es sollte immer überprüft werden ob diese nicht bereits existiert.:
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Dann poste Ihm hier doch bitte ein gaanz kleines Beispiel wie async. IO funktioniert. (Bitte als Java-Code)

-> Damit du nicht viel nachdenken musst: Kills aus einer .yml Datei auslesen zu einem Spieler
Leider nicht so einfach. Wenn er z.B. die informationen im selben Tick braucht, braucht er noch andere Konzepte (z.B. prefetching der Statistikdaten für Online Spieler). Mit einem einfachen Beispiel ist das nicht getan. Er wollte jedenfalls verhindern, dass sein Server bei IO laggt und da ist die korrekte Lösung Asynchrones IO. Wenn das mit einem einfachen Beispiel abgedeckt wäre, dann wär das schon lange fester Bestandteil von Bukkit, doch leider ist das sehr vom Anwendungsfall abhängig.

Mit dem Stichwort hat er nun jedenfalls alles was er braucht um sich weiter zu informieren und wenn er Fragen hat, kann er die gerne auch selbst stellen. Wenn er konkrete Hilfe möchte muss er das Problem auch konkret beschreiben. Statistiken nach einem Minigame speichern oder per Befehl abfragen geht noch sehr einfach. Sobald aber Aktionen abhängig von Daten auf der Festplatte getroffen werden sollen, wird es relativ schnell kompliziert. Natürlich kann man einfach hoffen, dass nix schief geht, aber wenn man potenziell mehrere Threads hat, die auf den selben Daten operieren, kann immer was kaputt gehen, wenn man es nicht richtig absichert und auch die Materie verstanden hat. Einfach einmal testen hilft da nicht.

Es ist übrigens auch nicht richtig, dass mit MySQL plötzlich alles besser läuft. MySQL liest die Daten auch von der Festplatte, sofern sie nicht schon im RAM sind. Wir haben nur keine Ahnung was für Daten in welcher Menge hier verarbeitet werden sollen, von daher helfen Beispiele nicht.
 
Zuletzt bearbeitet:
F

Figz

Guest
Leider nicht so einfach. Wenn er z.B. die informationen im selben Tick braucht, braucht er noch andere Konzepte (z.B. prefetching der Statistikdaten für Online Spieler). Mit einem einfachen Beispiel ist das nicht getan. Er wollte jedenfalls verhindern, dass sein Server bei IO laggt und da ist die korrekte Lösung Asynchrones IO. Wenn das mit einem einfachen Beispiel abgedeckt wäre, dann wär das schon lange fester Bestandteil von Bukkit, doch leider ist das sehr vom Anwendungsfall abhängig.

Das wollte ich lesen

Es ist übrigens auch nicht richtig, dass mit MySQL plötzlich alles besser läuft. MySQL liest die Daten auch von der Festplatte, sofern sie nicht schon im RAM sind. Wir haben nur keine Ahnung was für Daten in welcher Menge hier verarbeitet werden sollen, von daher helfen Beispiele nicht.

Nein, es ist trotzdem einfacher für Unerfahrene.
 

Lapura

Kuhfänger
Registriert
28 Dezember 2014
Beiträge
73
Alter
26
Diamanten
314
Leute, ich habe extra geschrieben NICHT MYSQL, wieso schreibt ihr dann wieder Jaaaaaaaa mysql ist viel besser bla bla bla, das hat seinen Grund why ich keine MySql haben will aber diesen Grund sage ich nicht ganz einfach, und ich habe halt gefragt wie man .yml betreiben kann, ohne das es lagt!
 

KillawOrCarel

Kuhfänger
Registriert
15 Juli 2017
Beiträge
78
Diamanten
1
Am besten erklärst du einmal, wieso du unbedingt *.yml Dateien nutzen möchtest?
YML ist eine durchaus valide Anforderung, insbesondere wenn diese Dateien auch von an andere Service weitergegeben werden sollen. Diese Weitergabe kann in einer Microservice Architektur Sinn ergeben. Das Schreiben und Lesen ist dabei schnell implementierbar (im Vergleich zu den hier dargestellten Datenbanken!).

Du hast bei Dateien ein einfaches Problem: dein Server kann jederzeit abstürzen und je nach dem, wie wichtig deine Daten sind, werden Änderungen dann nicht mehr gespeichert. Der Kompromiss dazu wäre, die Dateien einfach so zwischendurch zu speichern.
Das Problem besteht auch bei Datenbanken ;). Corruption ist auch bei der richtigen Implementierung kein Problem.

Ich weiß nicht, was du mit deinem Plugin vor hast, aber du wirst mit dem Ansatz spätestens dann auf die Klappe fliegen, wenn du mehr als einen Server hast und dieser die Informationen teilen soll.
Ein dezentralisierter Ansatz ist auch möglich. Die Art der Persistenz ist auch hier egal. Der hier präsentierte Ansatz ist nichts anderes als eine eigene Implementierung einer embedded Datenbank.

Leute, ich habe extra geschrieben NICHT MYSQL, wieso schreibt ihr dann wieder Jaaaaaaaa mysql ist viel besser bla bla bla, das hat seinen Grund why ich keine MySql haben will aber diesen Grund sage ich nicht ganz einfach, und ich habe halt gefragt wie man .yml betreiben kann, ohne das es lagt!
Aus rein architektonischer Sicht ist eine Datenbank wie H2 oder Postgres durchaus sinnvoll. Es nimmt einem die vielen Aufgaben ab und es kann SQL verwendet werden. Wenn diese oben genannten Gründe genannt werden würden, könnte man auch besser in der Domäne argumentieren.

Hier jedoch die "beleidigte Leberwurst" zu spielen hilft garnicht. Insbesondere wenn hier weder Profiling noch sonstige Daten zur Verfügung gestellt werden (Anmerkung: Wie denn auch, wenn man offensichtlich keine Ahnung von Lambda Symbolen, analytischen Fähigkeiten oder grundlegende Dankbarkeit hat). Wenn man genau lesen würde, dann werden auch weitere Stichworte genannt, die die Performance verbessern könnten (Async, Datastrukturen, Profiling, Buffer).

Hochachtungsvoll
 
F

Figz

Guest
Leute, ich habe extra geschrieben NICHT MYSQL, wieso schreibt ihr dann wieder Jaaaaaaaa mysql ist viel besser bla bla bla, das hat seinen Grund why ich keine MySql haben will aber diesen Grund sage ich nicht ganz einfach, und ich habe halt gefragt wie man .yml betreiben kann, ohne das es lagt!

JA! Genau das ist der richtige Ansatz! Meeeerken Leute! "Ich will die bestmögliche Hilfe, bei so wenig Informationen wie möglich.
Und wenn ich dann noch Hilfe bekomme, bin ich undankbar."

Ich bin immernoch der Meinung: Datenbanken sind schneller, besser und einfacher zu handlen. Ob ihr es wahrhaben wollt oder nicht.
Schließlich werden sie nicht nur zum Spaß von jedem vernünftigen Unternehmen verwendet.

Alleine die Abfragelogiken, die dahinter stecken sind zum Arbeiten ausschlaggebend. Baut mal eine SQL-Abfrage mit 5 Joins und einem Union in eurem IO scheiß nach. Dann seht ihr den Performanceunterschied.
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Dir ist aber klar dass eine Datenbank und dein sogenannter "IO scheiß" im grunde das selbe sind?
Der unterschied, eine Datenbank hat den ganzen müll einprogrammiert. Kannst du natührlich auch machen, ist dann halt je nach such algorithmen und co eben nicht ganz so effizient, dass ist auch der größte unterschied zwischen allen datenbanken, die algorithmen und die kommunikation nach außen.

Wenn du so ein System vernünftig machen willst kannst du es gerne in eine extra software einbauen, mit der du dich über daten packete unterhälst. Ist dann aber auch nichts anderes mehr als eine Datenbank, die vielleicht nicht ganz so professionel ist.
Und wenn du es gut machst kannst du auch deine 5fach abfragen nutzen die genauso performant sind wie eine Datenbank.
 

KillawOrCarel

Kuhfänger
Registriert
15 Juli 2017
Beiträge
78
Diamanten
1
Ich bin immernoch der Meinung: Datenbanken sind schneller, besser und einfacher zu handlen. Ob ihr es wahrhaben wollt oder nicht.
Schließlich werden sie nicht nur zum Spaß von jedem vernünftigen Unternehmen verwendet.

Du scheinst ja sehr viel im Leben schon an Unternehmen besucht haben. Datenbanken brauchen aber kein SQL um sich als solches zu bezeichnen. Viele Unternehmen verwenden Datenbanken weil dieses mittel bekannt ist, standardisierte ist und es Beratung zu kaufen gibt. Zudem wird häufig Activ Directory (LDAP) verwendet. Gänzlich anderes Feld.

Wenn du so ein System vernünftig machen willst kannst du es gerne in eine extra software einbauen, mit der du dich über daten packete unterhälst. Ist dann aber auch nichts anderes mehr als eine Datenbank, die vielleicht nicht ganz so professionel ist.
Das hat nichts mit Datenbanken zu tun. Eine Datenbank kann auch ohne Netzwerk eingebunden sein (embedded). Der Rest des Statements ist sehr schwammig, weil Datenbanken sehr vielfältig sind.
 

Benny1008

Kuhfänger
Registriert
14 Juni 2017
Beiträge
67
Diamanten
300
Minecraft
Benny1008
Leute, ich habe extra geschrieben NICHT MYSQL, wieso schreibt ihr dann wieder Jaaaaaaaa mysql ist viel besser bla bla bla, das hat seinen Grund why ich keine MySql haben will aber diesen Grund sage ich nicht ganz einfach, und ich habe halt gefragt wie man .yml betreiben kann, ohne das es lagt!
Hilfe angefragt - Hilfe bekommen - Undankbar =

mdtotl.jpg
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Das hat nichts mit Datenbanken zu tun. Eine Datenbank kann auch ohne Netzwerk eingebunden sein (embedded). Der Rest des Statements ist sehr schwammig, weil Datenbanken sehr vielfältig sind.

Bei der seperaten software ging es mir hauptsächlich darum dass so kaum fehler entstehen durch die Daten korumpiert werden da sie in verschiedenen Threads gleichzeitig editiert werden (klar 3 threads (kommunikation, lesen, schreiben) wären dennoch zu empfehlen sind aber je nach umfang dann auch nicht unbedingt nötig.
(Außerdem geht es hier um eine Simple Datenbank und keine Datenbank die zaubern kann)
 
F

Figz

Guest
Der Kern meiner ganzen Aussagen ist NICHT, dass es mit IO nicht möglich wäre. Was ich sagen will ist:
Wozu das ganze Zeug selbst programmieren (Zugriffssteuerung, Abfragealgorythmen, etc..) Wenn es Unternehemen gibt, die Millionen, wenn nicht sogar Milliarden in diese Projekte stecken.

@JTK222 Und du meinst, du kannst das alles alleine Programmieren? Dann bewirb dich doch mal bei Microsoft und ersetze die tausenden von Mitarbeiter du Supergenie.

Du scheinst ja sehr viel im Leben schon an Unternehmen besucht haben. Datenbanken brauchen aber kein SQL um sich als solches zu bezeichnen. Viele Unternehmen verwenden Datenbanken weil dieses mittel bekannt ist, standardisierte ist und es Beratung zu kaufen gibt. Zudem wird häufig Activ Directory (LDAP) verwendet. Gänzlich anderes Feld.

Mir ist bewusst, dass SQL nicht ausschlaggebend ist, um ein System als Datenbank zu bezeichnen.
 

Benny1008

Kuhfänger
Registriert
14 Juni 2017
Beiträge
67
Diamanten
300
Minecraft
Benny1008
Möchte doch noch etwas qualifiziertes dazu geben :D

das hat seinen Grund why ich keine MySql haben will aber diesen Grund sage ich nicht ganz einfach
Warum? Dann kann man dir viel effizienter Helfen. Wenn du schon nach Hilfe fragst wäre ich durchaus schlau alle Infos rauszugeben ;) Wenn wir nicht den spezifischen Grund wissen warum du kein MySQL benutzen willst/kannst, ist eigentlich klar das es dir weiterempfohlen wird.
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
@Figz ich habe nie gesagt dass ich es alleine machen könnte (naja mit 2-3 Jahren zeit vielleicht ja schon).
Außerdem es geht hier um yaml, was willst du da den aufwendiges programmieren? Eine vernünftige Datenstruktur ist hier mehr wert als komplexe such algorithmus.
Und ich habe auch nie behauptet dass du behauptet hast es würde mit einem IO system nicht gehen.
 

Lapura

Kuhfänger
Registriert
28 Dezember 2014
Beiträge
73
Alter
26
Diamanten
314
Ich bin Dankbar, hier noch mal an ALLE ein DANKE!!!
Nur es regt auf das ich schreibe ich will nichts von Datenbanken hören, dann kommt der erste eine Datenbank ist viel BESSER etc.
Das kann man sich einfach sparren, ich habe nach etwas gefragt und ihr bringt eine lösung was ich genau nicht machen will.!
Nochmal DANKE an ALLE!!
 
Oben