php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Problem, große Dateien bearbeiten über 4gb, kein mysql


 
wampisgood
22-11-2018, 22:27 
 
Hallo liebe Softwareentwickler :D
ich habe ein Problem :/
Das Problem ist, wie kann man mit nur 256mb server ram eine große Datei die weit über 4gb oder 8gb groß ist, bearbeiten?


Also z.b eine bestimmte Zeile. Beispiel: Zeile 7.789 bearbeiten ....



Mit file array ( array file ( string $filename [, int $flags = 0 [, resource $context ]] ) führt das ja zu einem Verarbeitungs Abbruch des Servers?


Wie könnte man das realisieren?


Mit einem Dateizeiger und fgets in der while schleife ließt man realtiv schnell eine bestimmte Zeile :) Habe mir mal dann den ram Verbrauch angeschaut :D mit memory_get_usage....
ca. 0.6kb ram bei einer 4gb großen datei.

Ich selber programmiere sehr gerne mit PHP :D und seit Jahren, bloss so einen Fall hatte ich noch nicht.


Ich bedanke mich :)

 
h3ll
22-11-2018, 22:49 
 
Mit einem Dateizeiger und fgets in der while schleife ließt man realtiv schnell eine bestimmte Zeile

Dann brauchst du ja nur noch fwrite(), um den veränderten Inhalt zu schreiben.

 
wampisgood
22-11-2018, 22:54 
 
ehrlich? ohh


Kannst du mir ein Beispiel geben :) das wäre sehr nett :)


Hier mein code um eine bestimmte Zeile auszulesen:


public function get_content_by_line($file, $pos)
{
$line = "";
$buffer_line = "";

$handle = fopen($file, "r");
if ($handle)
{
while (($line = fgets($handle)) !== false)
{
$i++;
if( $pos === $i )
{
$buffer_line = $line;
break;
}
}
fclose($handle);
}
else {}

return $buffer_line;
}

 
wampisgood
22-11-2018, 23:16 
 
wahrscheinlich eine kombi mit fseek(...) und fwrite(...) oder?
Also muss ich im offset bereich springen ...
Aber eine Frage habe ich noch .... Kann man mit fseek auch eine bestimmte Zeile anspringen?


Wer Rechtsschreibfehler oder Grammatikfehler findet darf Sie behalten :D

 
wampisgood
22-11-2018, 23:26 
 
Ich habe greade selber mit php und mit nem hexeditor festgestellt :)
das fseek immer nur bis zur Escape Sequenz '\n' (0x0A) ließt. Weiß nicht ob unter Windows mit '\r\n' auch bei '\r' schon stoppt. Bin Linux Fan :) und habe mich von Windows vor Monaten verabschiedet :D. Aber ich prüfe es mal trotzdem gleich :)

 
wampisgood
23-11-2018, 00:43 
 
Ich habe :) es schon fast selber hingekriegt :) mit dateizeiger, fgets und fwrite :) ich muss noch ermitteln mit strlen wie groß jeweils die zeile in der datei ist, dann alle so löschen :) Ich habe es fast kapiert mit dem offset Bereich :)
Trotzdem bedanke ich mich für die hilfe von euch. Super. Danke nochmals.
Ich wünsche euch eine erholsame und Gute Nacht :)

 
wampisgood
23-11-2018, 13:09 
 
Leider habe ich wieder ein problem :/ was leider aktuell ich nicht schaffe es zu lösen.
z.b habe ich eine Textdatei mit folgendem Inhalt:


1. oder 2. ist nur eine zeile :) ab dem 'h' beginnt das Zeichen



1.hallo1
2.hallo2
3.hallo3
4.hallo4
5.hallo5




Zeile 3 mit 'hallo3' belegt ja 6 bytes. Jetzt habe ich das problem das ich mit fgets und fwrite und dem Dateizeiger ja die 3 Zeile überschreiben kann, aber wenn ich z.b mehr wie 6 bytes habe z.b 200 bytes, dann zerstöre ich ja die anderen Informations Strukturen :/


Mir geht es darum sehr große Dateien sehr schnell zu schreiben ...
bei 4gb oder 8gb oder sogar 12gb alles in einem Array reinzuladen bringt ja nichts. Ich stehe wieder auf dem Schlauch. klar ich könnte auch, wenn ich weniger als 6 bytes haben z.b das den string hat "ist", bloss dann würde ja das so stehen =>"istlo3" ... man könnte ja eine Art Abbruchs tag einfügen z.b so "ist<~>". Das könnte man noch lösen :) aber wie löse ich das wenn ich mehr Zeichen habe als in der Zeile an sich (offset) ? Sollte ich einen Denkfehler haben, bitte sagt mir das :) Danke. Nochmals Vielen lieben Dank das ihr so nett seit und hilft, ich schätze das selber sehr.


Sorry wegen Grammatik und Rechtsschreibfehler... (ist nicht extra, ich habe leider eine schwäche)

 
wampisgood
23-11-2018, 13:12 
 
hallo h3ll danke nochmal, für deine hilfe von gestern :) ich glaube ich habe hier im thread etwas falsch geschrieben :/ ich bin immer bis nach unten gegangen (gescroolt) und dann hier auf Antworten gegangen. Aktuell habe ich wieder ein Problem :/ wo ich auf dem Schlauch stehe. Könntest du dir etwas Zeit nehmen, wenn es dir keine Umstände macht? Ich bitte dich wirklich (Aber nur, wenn du kannst, Zeit und Laune dafür hast). Danke, den letzten Eintrag von mir lesen ...

 
h3ll
23-11-2018, 13:20 
 
Ich weiß nicht, ob es vom OS Dateioperationen gibt, um Inhalte zu "verschieben". In der PHP-Doku habe ich dazu jedenfalls nichts gefunden. Es bleibt wohl nichts anderes übrig als die Datei bis zum Ende neu zu schreiben.

 
wampisgood
23-11-2018, 13:24 
 
hallo danke für deine Antwort. Schade... Oder man löst das so, man sagt, man reseviert für jede Zeile z.b 100kb und mit dem Abbruchstag z.b so <~> könnte man immer das ganze so umgehen :)
Aktuell fällt mir was anderes nichts ein ...

Ich programmiere selber mit über 9 Programmiersprachen und das schon ziemlich lange, bloss so ein Problem hatte ich persönlich selber noch nicht.

Ok danke schonmal :) Danke danke :jo::jo::jo:

 
wampisgood
23-11-2018, 13:32 
 
Komischerweise meint jemand hier aus diesem Thread, das es nicht möglich sei einfach in die Datei Position zu springen und zu überschreiben.

hier: (https://www.coding-board.de/threads/dateien-zeilen-ueberschreiben-c.29315/)

Ja aber das stimmt ja so auch wieder nicht, mit fgets und fwrite und Dateizeiger geht es ja :)


In einem englischen/amerikanischen Forum meinte ein Softwareentwickler man solle blockweise einlesen und schreiben, temporär, mit split_str oder wie die funktion heißt ...


Ich teste mal bisschen :) aber vielleicht hat hier jemand noch eine intelligente lösung.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:09 Uhr.