Autor | Zpráva | ||
---|---|---|---|
DarkMeni Profil |
#1 · Zasláno: 12. 10. 2012, 15:30:56
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 |
#2 · Zasláno: 12. 10. 2012, 15:52:24
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 |
#3 · Zasláno: 12. 10. 2012, 16:13:48
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 |
#4 · Zasláno: 12. 10. 2012, 16:22:30
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 |
#5 · Zasláno: 12. 10. 2012, 16:23:10 · Upravil/a: Tori
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 |
#6 · Zasláno: 12. 10. 2012, 16:41:34
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 |
#7 · Zasláno: 12. 10. 2012, 16:52:36
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ší :-) |
||
Časová prodleva: 12 let
|
0