Thomas Schmieder: C-Programm anstelle von PHP

Beitrag lesen

Hallo,

ja ich denke das komplette einlesen ist weitaus schneller als
jede Zeile.

Wie kommst du denn auf diesen Trichter? Warum sollte es schneller
sein ca. 200MB (1,6 Mio. Zeilen, pro Zeile ca. 170 Byte) komplett in
den Speicher zu schreiben und dann da zu verarbeiten als 1,6 Mio mal
ca. 170 Bytes auszulesen und zu verarbeiten?

Da ist schon was dran. 200MB einzulesen ist Quatsch. Die Datei hat Stand heute 115MB. Eine Woche habe ich noch, bis der Monat wieder voll ist. Rein nach Milchmädchenrechnung werden es demnach 153MB. (wenn ich hier noch viel poste, könnten es auch 150k mehr werden *gg*).

Du vergisst, dass der Speicher kein beliebig schnelles Medium ist.
Ganz im Gegenteil, bei der Kommunikation mit dem RAM ist sehr viel
Overhead enthalten. Mal ganz abgesehen davon dass das alloziieren
von 200MB Speicher auch sehr leicht in die Hose gehen kann.

Nene, wie immer gilt es einen Mittelweg zu finden. Zeichenweise
einzulesen ist sicher Quark. Aber die ganze Datei einzulesen ist
noch viel mehr Quark.

Das Einlesen in Blöcken sit da bestimmt eleganter. Nur liegen die Zeilenenden dann irgendwie, aber garantiert nicht auf Blockgrenze.

Ich werde wohl nicht drum herumkommen, doch beide Wege zu gehen: C UND das blockweise Lesen. Ein Speicherzugriff dauert ca. 8ns, ein Plattenzugriff dauert dagegen 8ms. Der bytestream ist real bis ca. 10Mbyte pro Sek. hochzupuschen. Also das würde schon was bringen.

Ich würde hingegen nur die neuen Zeilen einlesen und die alten
irgendwo schon fertig bearbeitet ablegen.

Woher weisst du, dass es alte Zeilen gibt? :-)

Genau das ist das Problem. Man muss wahrscheinlich im BIN-Mode blind reingreifen in die Datei, éinen Block lesen, den Rest der ersten Zeile wegschmeißen, den Anfang der letzten Zeile wegschmeißen, dann den neuen Einsprungspunkt berechnen für den nächsten Block (es ändert sich ja zum Glück nix mehr am alte Teil der Datei) usw usw.

Aber dafür halte ich PHP nicht für geeignet.

Dafür, wie man an die Neuerungen kommt, gibt es sicher diverse
Lösungen, je nachdem wie sicher Du prüfen willst.

Alte groesse im Gedaechtnis behalten, neue Groesse in Erfahrung
bringen und per fseek() den Datei-Pointer an die richtige Stelle in
der Datei setzen.

Eine einfache wäre sicher sich die Zeilenanzahl zu merken und dann
von dort an immer weiterzuarbeiten und die Zeilenanzahl erhöhen.

Sinnlos. Dann muesste man ja die Zeilen trotzdem alle einlesen.

Ja, wir haben variable Satzlänge. Ein DirectAccess ist also nicht möglich.

Ich denke so ist es am besten, denn C ist in deinem Fall
wahrscheinlich nicht in dem Maße schneller wie Du Dir das
vorstellst.

Das wäre eben auszuprobieen. Nur ich trau mich nicht. Mit C kann man sooo schön daneben greifen und dann ist der Server platt. Ich habe zwar noch einen "Übungsserver", aber da habe ich auch nur einen richtigen Fehlversuch frei.

Muss ich mich also vorher noch mit DiskImage ziehen beschäftigen. Ihr seht: Kettenreaktion.

Das haengt davon ab, was in dem Script alles geschieht. Das sagte
ich ja bereits.

Gruesse,
CK

Danke erstmal für den Dialog. Das hilft mir schon sehr, um meine Gedanken zu sortieren.

Grüße aus Braunschweig

Tom