Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuwanie linii z ogromnego pliku
Forum PHP.pl > Forum > PHP
dzafel
Mam problem, nie wiem jak obsłużyć plik o wielkości 2 GB
Chcę usunąć z niego jedną linię, np. 782. Wczytywanie tego pliku jako tablicy odpada.
Wymyśliłem jeden sposób, wczytywania linijka po linijce i wpisywania każdej linijki do nowego pliku, a gdy trafi na linię 782 to po prostu ją omija i leci dalej.

Może jest jakiś lepszy sposób na obsługę takich ogromnych plików?
piczu
moze tak by bylo cos szybciej
  1. <?
  2. $lines = file(($file);
  3. unset($lines[$nr]);
  4. $f=fopen($file2,"w");
  5. fwrite($f, implode("",$lines));
  6. fclose($f);
  7. ?>
dzafel
No tak, ale 2GB wczytać do tablicy to jest pewien problem. Trzeba mieć niezły serwer worriedsmiley.gif
E-d
  1. <?php
  2. $file = file("plik.php");
  3.  
  4. for($i = 782; $i < 783; $i++) { 
  5. unset($file[$i]);
  6. }
  7. ?>

Może coś tak popróboj, ale operacje na takim pliku niezależnie od sposobu będą obciążały serwer.
devnul
nei da się niestety tego zrobić lepiej niż wczytując linia po lini, rozwiązania przedstawione przez kolegów (wszystkich wyżej) wrzucają cały plik do pamięci a więc zajmują 2GB pamięci! - rozwiązanie jaknajbardziej nieoptymalne i mocożerne. Wczytując plik linia po lini i sprawdzając poszczególne linie na wystąpnienie niechcianej jes możę nie najszybszym sposobem ale nie grozi ci tu błąd z powodu braku pamięci.

pozdrawiam
NuLL
Cytat
Może coś tak popróboj, ale operacje na takim pliku niezależnie od sposobu będą obciążały serwer.

BZDURA - poprostu nie macie pojecia o programowaniu. Mowi Wam wogole cos wyrazenie "dostep swobodny" :?:

  1. <?
  2.    function readLine ($linenum,$fh) {
  3.        $line = fgets ($fh, 4096);
  4.        $pos = -1;
  5.        $i = 0;
  6.  
  7.        while (!feof($fh) && $i<($linenum-1)) {
  8.            $char = fgetc($fh);
  9.            if ($char != "\n" && $char != "\r") {
  10.                fseek($fh, $pos, SEEK_SET);
  11.                $pos ++;
  12.            }
  13.            else $i ++; 
  14.        }
  15.        $line = fgets($fh);
  16.        return $line;
  17.    } //readLine()
  18. ?>

Ta f-cja czyta dowolna linie z pliku. Przerob ja sobie tak aby usuwala wybrana przez Ciebie linie.
devnul
wszystko fajnie, ale NULL, powiedz mi z łaski swojej jaka funkcja w php odpowiada za usuwanie części pliku? bo jakoś nie zetknołem sie z taką jak do tej pory. Odczytanie dowolnej lini z pliku to jedno, ale usunięcie tej lini to drugie!
em1X
No to masz niezły problem rolleyes.gif Moze lepiej zamiast php władować jakiś app w c++ do cgi-binu ?
erix
jedyne co mi teraz przychodzi do glowy:

Zapisujesz do osobnego pliku zakres linii 0-<numer linii-1>, a potem <numer linii+1>-EOF. Linia po linii.

troche malo ekonomicznie, ale innego wyjscia nie widze...
piczu
Mozna tez wykorzystac system ale wtedy byloby to niebezpieczne.
Dajac wszystkim dostep do zapisu:
Kod
chmod a+w /home/my/filename

mozna wtedy wywolac sed:
  1. <?
  2. system("sed -e '".$linia."d' /home/my/filename");
  3. ?>

nie znam sie dobrze na sed, wiec jak zle to niech ktos poprawi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.