Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Usuwanie linii z ogromnego pliku
dzafel
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.06.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
piczu
post
Post #2





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


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. ?>
Go to the top of the page
+Quote Post
dzafel
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.06.2005

Ostrzeżenie: (0%)
-----


No tak, ale 2GB wczytać do tablicy to jest pewien problem. Trzeba mieć niezły serwer (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Go to the top of the page
+Quote Post
E-d
post
Post #4





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 9.04.2005

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
devnul
post
Post #5





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
NuLL
post
Post #6





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
devnul
post
Post #7





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
em1X
post
Post #8





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


No to masz niezły problem (IMG:http://forum.php.pl/style_emoticons/default/rolleyes.gif) Moze lepiej zamiast php władować jakiś app w c++ do cgi-binu ?
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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...
Go to the top of the page
+Quote Post
piczu
post
Post #10





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 11:08