• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ladezeit zu lang?

Flemli200

Mitglied
Hi,

ich habe ein problem... und zwar habe ich ein script geschrieben, welches mir lokal eine csv datei in eine Datenbank schreiben soll... diese Datei hat 10 Spalten und 16690 Zeilen.
Es existiert für jeden Monat solch eine Datei.
Manchmal kommen Datensätze doppelt vor also muss eine überprüfung der inhalte und der Datenbanktabelle stattfinden.

Mein Problem ist nun, das dieses Script zwar einwandfrei funktioniert. Die Daten werden eingelesen, geprüft und geschrieben.
Leider wird jedoch nach 1h ladezeit, was ab dem Datensatz für Juli stattfindet, die Ansicht der Website durch die Oberfläche "Die Webseite kann nicht angezeigt werden." ersetzt. Da diese Software zwar Lokal, also offline von Usern verwendet werden soll, die von der Materie an sich keine bis wenig ahnung haben und eine solche Anzeige als "Die Website bzw. Das Tool geht nicht" abstempeln und die Seite schließen, brauche ich eine lösung ;).
Das Script arbeitet nämlich im Hintergrund weiter und beendet seinen Vorgang so wie es sein soll...

Kann es sein, das der Browser der getestet wurde (IE) nach einer bestimmten Ladezeit die Daten der Website aus dem cache löscht?
Oder das er nach einer bestimmten Zeit den Ladevorgang der Website unterbricht und sagt: Geht nicht?
Wenn ja, was wäre da eine lösung?

Hoffe auf schnelle antwort, projekt muss nächste Woche fertig sein ^^

Grüße

Flemming
 
Werbung:
Also ich mache sowas ähnliches, aber mit einer etwas größeren Datei. Das einlesen, prüfen der Daten und speichern in einer mysql DB dauert keine Sekunde, warum dauert das bei dir 1 Stunde?
 
Das Script nimmt die vorhandene Datenbank, checkt auf 3 suchparameter ob der eintrag schon existiert und schreibt dann den Eintrag.
Wenn ich bei August bin (also der 8. Datei) sind in der Datenbank bereits 116830 Datensätze, die von dem Script auf vorhandensein gecheckt werden.
Und das leider bei jedem eintrag. Heißt, bei jeder Zeile die eingetragen wird, wird einmal die Datenbank ausgelesen, der inhalt auf vorhandensein geprüft (ich mach das mit SELECT und dann prüfen mit mysql_num_rows) und dann je nachdem geschrieben oder übersprungen.

Denn die Datensätze existieren teilweise auch doppelt nur von einer anderen Firma oder einige einträge in der CSV Datei sind doppelt (hässliche rohdaten... ;) ).
 
Werbung:
Das Script nimmt die vorhandene Datenbank, checkt auf 3 suchparameter ob der eintrag schon existiert und schreibt dann den Eintrag.
Wenn ich bei August bin (also der 8. Datei) sind in der Datenbank bereits 116830 Datensätze, die von dem Script auf vorhandensein gecheckt werden.
Und das leider bei jedem eintrag. Heißt, bei jeder Zeile die eingetragen wird, wird einmal die Datenbank ausgelesen, der inhalt auf vorhandensein geprüft (ich mach das mit SELECT und dann prüfen mit mysql_num_rows) und dann je nachdem geschrieben oder übersprungen.

Denn die Datensätze existieren teilweise auch doppelt nur von einer anderen Firma oder einige einträge in der CSV Datei sind doppelt (hässliche rohdaten... ;) ).
Abgesehen davon, dass jetzt von 10 mal mehr Daten die rede ist, das Problem kenne ich.

Aber wenn es wirklich um die Größenordnung von ein paar hundertausend Daten geht, wirst du entweder diesen Weg mehrmals zerstückeln müssen, also immer nur soviele Einträge machen wie der Server verkraftet und dann bei einem neuen request die nächsten oder du brauchst einen entsprechend leistungsfähigeren Server.

Wobei aber auch der aufbau der Tabellen hier eine enorme Bremse sein kein, wenn die Indizes falsch gesetzt werden oder die Abfrage schlecht ist.
 
Was die Anfrage angeht: sie läuft ganz einfach und simpel... WHERE und dann die Paramehter dahinter.

Was den Server angeht... geht leider nicht... soll lokal auf einem Rechner laufen und nicht auf irgendeine externe maschiene... und was die lokale Leistung angeht, kann ich nur sagen, das in etwa 4GB DDR3 Ram drinstecken und das ganze über xampp läuft.
Hab mir da schon die aktuellste version geholt.

Und das zerstückeln... das wäre eine idee... müsste ja einfach noch eine option dazwischenbauen, welche die Datei in keine ahnung... dateien zerlegt die nur 1000 Zeilen haben oder so...
 
Was die Anfrage angeht: sie läuft ganz einfach und simpel... WHERE und dann die Paramehter dahinter.
Das hat nichts mit der Abfrage zu tun, sondern wie gesagt mit den Indizes, hast du denn welche gesetzt?


Was den Server angeht... geht leider nicht... soll lokal auf einem Rechner laufen
Dann hast du alle Freiheiten und kannst dem server sagen, er soll länger laufen bevor er ein Skript abbricht. z.b. PHP: Laufzeit-Konfiguration - Manual
 
Werbung:
Hmm... :D

Ich glaub ich hab garkeine indizies gesetzt...
Hab ehrlich gesagt noch nciht sooo viel mit Datenbanken gearbeitet und mir das meiste selber zusammengefrickelt... ^^

Wozu sind die gut?
 
Was die Anfrage angeht: sie läuft ganz einfach und simpel... WHERE und dann die Paramehter dahinter......
Sagst du, ohne den Sql-Code kann man dir natürlich Recht geben oder auch widersprechen.

Ich widerspreche mal und behaupte, man kann das besser machen, einfach so. Sei so nett und beweis mir das Gegenteil (anders formuliert, gib mal Code...) ;-)

Schlagwort UNIQUE

oder
constraint-primary-key

Dann kann die Prüfung vielleicht enfallen
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
der Code ist im moment so aufgebaut:

SELECT Bezeichnung,Gueltig_ab,Gueltig_bis,Abrechnungswert_kwh,Abgegrenzter_wert,Bilanzkreis,Haendler,Firma,JM FROM Zaehlpunkte_SLP WHERE Bezeichnung=xy AND Bilanzkreis=yz AND JM=bla

In etwa so... die Tabellen werden jeweils unterschiedlich ausgelesen (in unterschiedlichen Abfragen) die aber an sich alle gelcieh aufgebaut sind.
Cool wäre wenn die Abfrage iwie schneller laufen könnte, weil ab 120000 einträgen das EInlesen verdammt langsam wird.
Hab schon elemente zum prüfen rausgenommen... läuft ein bisschen schneller, aber nicht viel ^^
 
Cool wäre wenn die Abfrage iwie schneller laufen könnte, weil ab 120000 einträgen das EInlesen verdammt langsam wird.
Hab schon elemente zum prüfen rausgenommen... läuft ein bisschen schneller, aber nicht viel ^^
Eben, weil du keine oder die falschen Indizes gesetzt hast, aber ich rede hier gegen eine Wand.
 
Nein... ich verstehe blos nicht, wie ich so etwas setze...
Bin im internet nur auf - für mich bzw. meinen momentanen stand - kryptische erklärungen zum setzen dieser indizies gestoßen...
Entweder bin ich zu blöd um google richtig zu verwenden oder ich schnalls nich ;)

Brauche evtl ein beispiel, mit dem ich arbeiten kann ^^

Würde das ganze gerne anpassen... aber weiß eben nicht wie... hab mir schon viel durchgelesen versteh das aber iwie nich... ^^
 
Werbung:
Noch eine Anmerkung:
Nein... ich verstehe blos nicht, wie ich so etwas setze...
Bin im internet nur auf - für mich bzw. meinen momentanen stand - kryptische erklärungen zum setzen dieser indizies gestoßen...
Entweder bin ich zu blöd um google richtig zu verwenden oder ich schnalls nich ;)
Das ist ja schön und gut - nur WIR Wissen davon nichts, wir sehen nur, dass deine Fragen sich im Kreis drehen und du auf Ratschläge (hier) nicht reagierst. Nach dieser aussage von dir, verstehe ich nicht warum du dann nicht fragst?
 
Zum Thema Index kann ich dir eine meiner Standart Methoden nennen, da ich selbst nur wenig mit Indixen beschäftigt habe bzw. selbst nicht kapiert habe, was die ganze Theoretische Erklärungen bedeuten sollen.

Ich habe erst vor paar Tagen mal wieder gegooglet was die Indizen sind, da stand irgendwas mit "zum beschleunigen der Datenbank". Durch die Indizen Liest die Datenbank z.B. Vorerst die 15. Spalte aus und Checkt sie nach den "Such Vorraussetzungen" und wenn er die Daten hat, liest er nicht mehr den gleichen Eintrag durch, was ja Zeit einspart.

Durch einen Kollegen hab ich in meiner Anfangszeit als Coder stehts das selbe Muster verwendet:

Tabelle: Egal

1. Spalte
Name: id
Typ: int
Value: 11
Auto_Increment: Ja / Häckchen
( Hier haben wir ihn ) Key: Primary

Hoffentlich hilft das weiter.
 
Werbung:
Ich habe erst vor paar Tagen mal wieder gegooglet was die Indizen sind, da stand irgendwas mit "zum beschleunigen der Datenbank". Durch die Indizen Liest die Datenbank z.B. Vorerst die 15. Spalte aus und Checkt sie nach den "Such Vorraussetzungen" und wenn er die Daten hat, liest er nicht mehr den gleichen Eintrag durch, was ja Zeit einspart.
Im Prinzip richtig. Der Index ist eine separate Tabelle, die viel schneller durchsucht werden kann, wie die komplette Tabelle. Aber das ist natürlich nur begrenzt möglich, wenn man z.b. einen Index auf alle Felder legen würde, ist das natürlich nicht mehr schneller, sondern eher langsam, deshalb ist die Frage des Index beim Design der Datenbank eine der wichtigsten.
 
Sry... hab mich komisch ausgedrückt ;)

Also bei der Abfrage (EXPLAIN tabellenname) von der großen tabelle, kam folgendes raus

Eingabe: EXPLAIN zaehlpunkte_slp

Ausgabe:

idint(255)NOPRINULLauto_increment
Bezeichnungvarchar(100)NONULL
Gueltig_abvarchar(100)NONULL
Gueltig_bisvarchar(100)NONULL
Abrechnungswert_kwhdouble(12,6)YESNULL
Abgegrenzter_wertdouble(12,6)YESNULL
Bilanzkreisvarchar(100)NONULL
Haendlervarchar(100)NONULL
Firmavarchar(100)NONULL
JMint(255)NONULL

was heißt das jetzt?
Hab wie gesagt wenig erfahrung mit sql ^^
 
Ohje - das heißt erst mal, dass du wahrscheinlich so gut wie nichts über sql gelesen hast.

Das z.b. Datumsabfragen mit mySQL Prima ausgeführt werden, wenn du ein entsprechendes Feld benutzt (aber ich vermute das wurde dir hier schonmal gesagt). Solche Felder wie Gueltig_ab, Gueltig_bis müssen Date oder eventuell DateTime Felder sein.

Aber egal, du hast Explain auch nicht verstanden, das schreibst du vor deine eigentliche Abfrage, also nicht Explain Dateinname. Das ist nur eine Beschreibung der Tabelle, steht aber auch auf der verlinkten Seite.
 
Werbung:
Bei der Abfrage:
EXPLAIN SELECT'Bezeichnung,Gueltig_ab,Gueltig_bis,Abrechnungswert_kwh,Abgegrenzter_wert,Bilanzkreis,Haendler,Firma,JM'
FROM Zaehlpunkte_slp
WHERE'JM' ='201001'
AND'Bilanzkreis' ='GASPOOLH00420003'
AND'Bezeichnung' ='DE7000731745449000107440000000000'

gibt es die Ausgabe:
1SIMPLENULLNULLNULLNULLNULLNULLNULLImpossible WHERE

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
 
mit den überschriften - sollte er sie jetzt anzeigen ;) -


id select_type table type possible_keys key key_len ref rows Extra
 
Zurück
Oben