Autor Zpráva
DarkMeni
Profil
Zdravím, dá se nějakou funkcí postupně odmazávat ze začátku souboru?
Ten soubor může mít i několik desítek MB, a tak si myslim že načtení do paměti a odseknutí přes substring buď skončí chybou kvůli překročení limitu paměti, kterou si můžu z RAM na serveru pučit, nebo to projde (kdyby se ten soubor do proměnné ještě vešel) ale i tak mi to připadá neefektivní.
Existuje funkce, která by odmazala několik B, kB popř. MB ze začátku souboru aniž by ho nejdřív načetla do paměti?
Alphard
Profil
Nevím o ni, jen konec, to např. popmocí ftruncate().
O co se snažíte? Jestli to mají být nějaké logy, pojmenovávejte soubory podle data a staré mažte jako celek.
DarkMeni
Profil
Právě že já už ten soubor mám a už má něco kolem 10MB, tak ho chci právě rosekat a to, co nepotřebuju, smazat.
Když to zkusim ručně (otevřít v notepadu), tak mi to akorát zasekne kompa.
Načítá fopen() soubor do mezipaměti? Jestli ne, tak by možná šlo použít fseek() a fread(), párkrát ten skript na rozkouskování toho souboru zpustit (páč ten timelimit, co má Mozilla na ukončení spojení, asi na zpracování toho souboru stačit nebude), a pak to bude v pohodě. Jenže nevim jestli fopen() jen řekne serveru, že za chvíli bude pracovat s nějakým souborem, nebo jestli si ho rovnou uloží do RAM - nemá s tím někdo nějaké zkušenosti?
Joker
Profil
DarkMeni:
Úprava dat uvnitř souboru probíhá tak, že se starý soubor smaže a nahradí novým, což je dané způsobem uložení souborů na disku.

Existuje funkce, která by odmazala několik B, kB popř. MB ze začátku souboru aniž by ho nejdřív načetla do paměti?
Taková funkce půjde udělat, stačí ten soubor načítat postupně.
Tj. otevřít soubor, přeskočit dané množství bajtů, zbytek postupně po částech zapsat do dočasného souboru, ten původní pak smazat a dočasný přejmenovat na jeho místo.

Když to zkusim ručně (otevřít v notepadu), tak mi to akorát zasekne kompa.
K tomu poznatek, třeba PSPad (a možná ani ten Notepad) s velkými soubory nemá až takový problém, za jedné podmínky: Musejí být rozdělené na řádky.
Tj. načíst třeba 20MB soubor, kde data tvoří jeden obrovský řádek, trvá věčnost. Načíst 20MB soubor tvořený desetitisíci řádků je v pohodě.

Jinak ale Notepad i PSPad soubory velké třeba desítky MB normálně otevřou a dá se s nimi pracovat, jenom to chvíli trvá.
Tori
Profil
DarkMeni:
Je tu možnost, ale místo paměti zabere víc místa na disku (dočasně):
$f = fopen('./puvodni', 'r');
$c = fopen('/tmp/soubor', 'w+');
fseek($f, 3e6); // ofset, kam az to chcete odmazat
while (!feof($f)) {
    fwrite($c, fread($f, 8192)); // po jakych blocich kopirovat, ovlivni RAM
}
fclose($f);
fclose($c);
copy('/tmp/soubor', .'/puvodni');
unlink('/tmp/soubor');



DarkMeni:
ten timelimit, co má Mozilla na ukončení spojení, asi na zpracování toho souboru stačit nebude
koukněte na set_time_limit a ignore_user_abort
DarkMeni
Profil
Joker:
jenom to chvíli trvá.
Asi sem se tý chvíle nedočkal
Ale pak co by se mi otevřel 10MB soubor, tak ozančování 8MB znaků by stejně trvalo věčnost :D

Tori:
Jo, to je ono, díky!
Joker
Profil
DarkMeni:
Asi sem se tý chvíle nedočkal
Zvláštní, občas s tak velkými soubory dělám a nepřišlo mi to tak hrozné. Možná taky záleží na rychlosti počítače.

ozančování 8MB znaků by stejně trvalo věčnost :D
V takovém případě bych se přesunul někam zhruba do 2/3 souboru, ctrl+Home, Delete, uložit… a rázem je soubor daleko menší a práce s ním rychlejší :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: