Sie sind nicht angemeldet.

DaBu

Administrator

  • »DaBu« ist der Autor dieses Themas

Beiträge: 873

Danksagungen: 333

  • Nachricht senden

21

Donnerstag, 12. Januar 2017, 00:12

Irgendwas mit Medien

BlackScorp

Moderator

Beiträge: 1 235

Wohnort: 127.0.0.1

Danksagungen: 398

  • Nachricht senden

22

Donnerstag, 12. Januar 2017, 09:31

also

"11,2 GiB " = 44.958.361 einträge = 31,8 Bytes im Schnitt pro eintrag

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php


$report = [
	'id' => "123456",
	'kbrand' => "*****",
	'time' => "*****",
	'attcoords' => "***:***:**",
	'defcoords' => "***:***:**",
	'attuser' => "*****",
	'defuser' => "*****",
	'attalliance' => "*****",
	'defalliance' => "",
	'score' => "3450",
	'winner' => "a",
	'kb' => "JSON mit allen weiteren Informationen",
];
$string = json_encode($report);

echo strlen($string)."<br/>"; //245 Bytes
echo strlen(gzcompress($string, 9))."<br/>"; //144 Bytes
echo strlen(gzdeflate($string,9))."<br/>"; //138 Bytes

echo strlen(gzcompress(gzdeflate($string,9), 9))."<br/>"; //149 Bytes
echo strlen(gzdeflate(gzdeflate($string,9), 9))."<br/>"; //143 Bytes
echo strlen(gzcompress(gzcompress($string,9), 9))."<br/>"; //155 Bytes
echo strlen(gzdeflate(gzcompress($string,9), 9))."<br/>"; //149 Bytes

$string = '
	<?php
	namespace battlereports\a\b\c;
	class Report123456 extends AbstractReport
	{
   	public $id = \'123456\';
   	public $kbrand = \'*****\';
   	public $time = \'*****\';
   	public $attcoords = \'***:***:**\';
   	public $defcoords = \'***:***:**\';
   	public $attuser = \'*****\';
   	public $defuser = \'*****\';
   	public $attalliance = \'*****\';
   	public $defalliance = \'\';
   	public $score = \'3450\';
   	public $winner = \'a\';
   	public $kb = \'JSON mit allen weiteren Informationen\';
	}
';



echo strlen($string)."<br/>"; //516 Bytes
echo strlen(gzcompress($string, 9))."<br/>"; //224 Bytes
echo strlen(gzdeflate($string,9))."<br/>"; //218 Bytes

echo strlen(gzcompress(gzdeflate($string,9), 9))."<br/>"; //229 Bytes
echo strlen(gzdeflate(gzdeflate($string,9), 9))."<br/>"; //223 Bytes
echo strlen(gzcompress(gzcompress($string,9), 9))."<br/>"; //235 Bytes
echo strlen(gzdeflate(gzcompress($string,9), 9))."<br/>"; //229 Bytes


ich hab versucht mit PHP es irgendwie zu komprimieren, das kleinste Ergebnis war gzdeflate von einem json_endcode, da kam 138 bytes raus. Durch die Komprimierung verlieren wir aber die Lese Vorteile einer klasse. Ich glaube das nächst einfachste was du ausprobieren kannst, wäre MongoDB oder ElasticSearch DB ich denke die NO Sql Datenbanken verschwenden noch weniger platz, die Betonung liegt auf Glauben :D

aber immerhin gut zu wissen das Ganze. Ich bin mal gespannt wann du sagst "Ach was solls"

LG
Qualität eines Codes misst man in WTF/Sekunde

DaBu

Administrator

  • »DaBu« ist der Autor dieses Themas

Beiträge: 873

Danksagungen: 333

  • Nachricht senden

23

Donnerstag, 12. Januar 2017, 10:06

Ich hatte eben noch einen kleinen Nachtrag gemacht, man hätte ggf. bedenken sollen, dass die Dateien immer in 4KiB Blöcken gespeichert werden, da wird es schwer eine so kleine Datei zu bekommen, wie die Einträge die an sich in der Datenbank sind. Du hast dich im übrigen verrechnet, es sind in der Datenbank 267 Byte pro Eintrag.

Da macht dein Ergebnis bei dem JSON ohne Komprimierung auch mehr Sinn. Ich habe im übrigen die Einträge in der Datenbank nicht komprimiert. Speicherplatz ist ja nicht sonderlich teuer, aber verschwenden muss man ihn auch nicht.
Irgendwas mit Medien

BlackScorp

Moderator

Beiträge: 1 235

Wohnort: 127.0.0.1

Danksagungen: 398

  • Nachricht senden

24

Donnerstag, 12. Januar 2017, 10:26

das Problem ist, da wo du eventuell paar bytes gesparrt hast, wirst du mit CPU ausgleichen müssen(finden, dekomprimieren, darstellen)
Qualität eines Codes misst man in WTF/Sekunde

Carpenter

Schüler

Beiträge: 83

Wohnort: München

Danksagungen: 19

  • Nachricht senden

25

Donnerstag, 12. Januar 2017, 11:02

Vielleicht kann man alte Kampfberichte aus der DB entfernen?
Alternativ hat MySQL auch einen JSON Datentyp bei dem das speichern und auslesen von Daten im JSON Format effizienter von statten geht.

DaBu

Administrator

  • »DaBu« ist der Autor dieses Themas

Beiträge: 873

Danksagungen: 333

  • Nachricht senden

26

Donnerstag, 12. Januar 2017, 11:07

Es geht darum die Berichte aus der Datenbank zu holen, nicht sie effizienter dort zu speichern.

Wenn es keinen besseren Weg gibt sie zu speichern, werde ich wohl schlicht und einfach hingehen und sie deutlich reduzieren.
Irgendwas mit Medien

BlackScorp

Moderator

Beiträge: 1 235

Wohnort: 127.0.0.1

Danksagungen: 398

  • Nachricht senden

27

Donnerstag, 12. Januar 2017, 11:11

Es geht darum die Berichte aus der Datenbank zu holen, nicht sie effizienter dort zu speichern.

Wenn es keinen besseren Weg gibt sie zu speichern, werde ich wohl schlicht und einfach hingehen und sie deutlich reduzieren.

Du willst sie ja quasi aus der DB Holen weil du durch Backups der DB noch mehr speicherplatz verbrauchst richtig? Da kannst du ja mit exclude-table arbeiten https://dev.mysql.com/doc/mysql-enterpri…en/partial.html dann gibt es ja nocht compressed backup
Qualität eines Codes misst man in WTF/Sekunde

Carpenter

Schüler

Beiträge: 83

Wohnort: München

Danksagungen: 19

  • Nachricht senden

28

Donnerstag, 12. Januar 2017, 11:13

Vielleicht würde es auch etwas nützen den Kampfberichten ein genrelles Ablaufdatum zu geben und dann zu entfernen wenn diese weniger als X Mal angeschaut worden sind.

DaBu

Administrator

  • »DaBu« ist der Autor dieses Themas

Beiträge: 873

Danksagungen: 333

  • Nachricht senden

29

Donnerstag, 12. Januar 2017, 12:47

Ich habe die Kampfberichte bereits aus dem häufigsten Backup heraus genommen. Mir geht es darum, dass jedes mal quasi ein Vollbackup der Tabelle gemacht werden muss.
Da die Kampfberichte ID fortlaufend ist, habe ich bereits ausprobiert immer nur die neu dazu gekommenen Berichte zu sichern, allerdings hat das nicht sonderlich gut funktioniert.

Wenn ich die Berichte als Dateien habe, kann ich über ein Diff entscheiden, welche Berichte noch gesichert werden müssen.
Vielleicht bin ich auch komplett auf dem falschen Weg und es ist doch sinnvoller weiterhin die Berichte in der Datenbank zu halten und entsprechend einmal am Tag 1,7 GiB Backup an Berichten herunter zu laden.

Wenn ich dann mal ein Backup einspielen muss stören mich die Berichte eben beim Import, generell sind sehr große Tabellen nervig wenn man alles neu einspielen muss, wenn es zu einem Ausfall kommt.
Irgendwas mit Medien

Carpenter

Schüler

Beiträge: 83

Wohnort: München

Danksagungen: 19

  • Nachricht senden

30

Donnerstag, 12. Januar 2017, 13:15

Wie wäre es wenn du eine Json Datei pro Ziel anlegst.
Quasi für jeden Zieluser eine Datei und dort die Kampfberichte als array ablegst.

Also User A fliegt auf C und es kommt nen Bericht.
User B fliegt irgendwann ebenfalls auf C und es kommt nen Bericht.

Beide Kampfberichte könnte man dann in einer Datei C ablegen.

Um zu entscheiden welche Datei du sichern musst könntest du zB die Größe vergleichen.

Harald

Fortgeschrittener

Beiträge: 255

Danksagungen: 88

  • Nachricht senden

31

Freitag, 13. Januar 2017, 18:25

Kann man nicht 100.000 Kampfberichte in eine Datei auslagern? Die werden doch eh nur selten gelesen. Statt jetzt 100.000 Dateien anzulegen die schon pro Datei 4 kb mindestens schlucken, wäre es doch vielleicht möglich, zu sammeln. Könnte man dann evtl. auch noch zippen (zumindest ginge das bei der Größe).

Ist nur eine unbedarfte Noob-Frage... wenn das nix ändert oder so... sorry... dann einfach ignorieren.

McDev

Schüler

Beiträge: 64

Danksagungen: 22

  • Nachricht senden

32

Sonntag, 15. Januar 2017, 23:18

Vielleicht würde es auch etwas nützen den Kampfberichten ein genrelles Ablaufdatum zu geben und dann zu entfernen wenn diese weniger als X Mal angeschaut worden sind.

Wäre meine erste Wahl. Der User könnte einzele Berichte ja archivieren oder Favorisieren. Warum dieser Aufwand wenn 95% der Berichte irrelevant sind für die Spieler, zumindest nach X Tagen. Hier solltest du dir die Frage stellen was es deinen Spielern bringt. Ich fand als Spieler eine aufgeräumte Berichtsseite viel angenehmer.

Kann man nicht 100.000 Kampfberichte in eine Datei auslagern? Die werden doch eh nur selten gelesen. Statt jetzt 100.000 Dateien anzulegen die schon pro Datei 4 kb mindestens schlucken, wäre es doch vielleicht möglich, zu sammeln. Könnte man dann evtl. auch noch zippen (zumindest ginge das bei der Größe).

Das ist was den Speicher angeht sicherlich besser nur der Zugriff wäre etwas langsam. Alternativ teilst du die Berichte nochmal ein, etwa jeden Monat wird ein neuer Satz erstellt. Dadurch musst du einmal geschriebene Daten nichtmehr ändern. Aber es würde ja nur sehr punktuell gebraucht werden. Favorisierte Beiträge könnte man weiterhin regulär speichern.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »McDev« (15. Januar 2017, 23:25)


Ähnliche Themen

Social Bookmarks

Thema bewerten