Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skrypt sortujący plik
Beniooo
post 22.07.2012, 09:54:32
Post #1





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


Witam, poszukuje skryptu kjtóry mi posortuje słowa znajdujące się w pliku tekstowym, każde słowo jest w innym wierszy, słów jest mniej niż 3 miliony, a pliczek ma rozmiar ~36MB
Dostałem od usera na forum takie coś:
  1. <?php
  2. $file = file_get_contents("slowa-win.txt");
  3. $file_lines = explode("\n", $file);
  4.  
  5.  
  6. for($i=0;$i<count($file_lines);$i++)
  7. {
  8.  
  9. $line_length[$i] = mb_strlen($file_lines[$i]);
  10. }
  11.  
  12. asort($line_length);
  13.  
  14. foreach ($line_length as $kl => $linel)
  15. {
  16. echo "$file_lines[$kl]<br>";
  17. }
  18. ?>


Niestety nie działa, wyświetla błąd "Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 36854802 bytes) in C:\AppServ\www\index.php on line 6"
Ma ktos skrypt który posortuje ten plik żeby słowa były od najkrótszego do najdłuższego?


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
toaspzoo
post 22.07.2012, 12:19:56
Post #2





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

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


Wartość dozwolonej pamięci zdefiniowanej w php.ini została przekroczona. Zwróć się do usługodawcy o zwiększenie parametru, obecnie jest to jedynie 24MB a potrzeba ponad 34

Lub spróbuj wrzucić zaraz po <?
  1. ini_set('memory_limit',52428800);


Jeśli nie zadziała, napisz do providera o zmianę parametru memory_limit na 50M

Ten post edytował toaspzoo 22.07.2012, 12:18:56


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
Beniooo
post 22.07.2012, 12:54:45
Post #3





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


tak, a teraz "Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 35 bytes) in C:\AppServ\www\index.php on line 9"

Ten post edytował Beniooo 22.07.2012, 12:55:12


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
toaspzoo
post 22.07.2012, 13:57:36
Post #4





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

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


Daj konfigurację php.ini


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
Beniooo
post 22.07.2012, 14:13:56
Post #5





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


mam na appservie(localhost) i mam plik php.ini-dist
zawartość pliku : http://pastebin.com/XEFuJQGG


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
zegarek84
post 22.07.2012, 16:27:24
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


nie wczytuj na raz całego pliku ;]
  1. <?php
  2. $aLineLength = new ArrayObject();
  3. $file = new SplFileObject('./slowa-win.txt');
  4. foreach ($file as $line) {
  5. $aLineLength[] = mb_strlen($line);
  6. }
  7. $aLineLength->asort();
  8. $iterator = $aLineLength->getIterator();
  9. while ($iterator->valid()) {
  10. $file->seek($iterator->key());
  11. echo $file->current(), '<br />';
  12. $iterator->next();
  13. }

lub skorzystaj z tymczasowej bazy danych np. SQLite

Ten post edytował zegarek84 22.07.2012, 16:31:11


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Beniooo
post 23.07.2012, 10:10:22
Post #7





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


Wrzuciłem na xaa i teraz coś takiego Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 71 bytes)


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
redeemer
post 23.07.2012, 10:22:31
Post #8





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Dlaczego to musi być skrypt? PHP nie nadaje się do takich rzeczy jak sortowanie plików o takich wielkościach (chyba że zrzucimy to na bazę danych, ale tutaj PHP miałoby tylko rolę "odczytaj linię i wrzuć do bazy"). Zasadnicze pytanie jest takie: czy chcesz ten plik posortować, czy chcesz mieć skrypt w PHP, który Ci to posortuje?

Edit: Postanowiłem jednak się zabawić i napisać skrypt w PHP (bez udziału baz danych) oparty na plikach tymczasowych (w celu ograniczenia zużycia pamięci). Nie sortuje on jednak alfabetycznie, ale tylko po długości.
  1. <?php
  2.  
  3. $fnameIn = 'input.txt';
  4. $fnameOut = 'output.txt';
  5. $tmpFilePrefix = '/tmp/xx_length.';
  6. $chunks = 4; // how many files per one length
  7.  
  8. //@todo check if fnameIn exists
  9.  
  10. /* step 1, separate lines with same lengths into different files, they're also chunked */
  11. $f = fopen($fnameIn, 'r');
  12. $maxLength = -1;
  13. $chunkArr = array();
  14.  
  15. while(!feof($f)) {
  16. $line = fgets($f);
  17.  
  18. $lineLength = mb_strlen($line);
  19. if ($lineLength > $maxLength) {
  20. $maxLength = $lineLength;
  21. }
  22.  
  23. if (!isset($chunkArr[$lineLength])) {
  24. $chunkArr[$lineLength] = 0;
  25. //@todo clear $tmpFname file (with all chunks). When "step 2" won't remove tmp files somehow, we will have doubled content, couse of FILE_APPEND flag
  26. }
  27.  
  28. $tmpFname = $tmpFilePrefix.$lineLength.'_'.($chunkArr[$lineLength]++%$chunks);
  29. file_put_contents($tmpFname, $line, FILE_APPEND); }
  30.  
  31. fclose($f);
  32.  
  33. /* step 2, merge and delete all temporary files
  34. This may also be memory consumpting (ex. when all lines have same length and we have chunks set to 1), but in most cases should be better than sorting whole file at once
  35. */
  36.  
  37. $f = fopen($fnameOut, 'w');
  38.  
  39. for($i=0; $i<=$maxLength; $i++) {
  40.  
  41. // check all chunks
  42. for($k=0;$k<$chunks;$k++) {
  43. $tmpFname = $tmpFilePrefix.$i.'_'.$k;
  44.  
  45. if (file_exists($tmpFname)) {
  46. $content = file_get_contents($tmpFname);
  47. fputs($f, $content);
  48. unlink($tmpFname);
  49. }
  50. }
  51. }
  52.  
  53. fclose($f);

Co do samego jednorazowego posortowania to nie wiem jak pod Windowsem, ale polecenie, które zadziała pod Linuksem wkleiłem Ci w poprzednim wątku http://forum.php.pl/index.php?s=&showt...st&p=979723. Na windowsie możesz zainstalować sobie cygwin - konsola i narzędzia konsolowe z linuksa.

Ten post edytował redeemer 23.07.2012, 11:22:07


--------------------
Go to the top of the page
+Quote Post
Beniooo
post 23.07.2012, 11:11:43
Post #9





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


ogólnie to chce to tylko posortować, ale ksrypt też by się przydał, lecz priorytetem jest jednorazowe posortowanie


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
toaspzoo
post 23.07.2012, 15:30:25
Post #10





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

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


Jeśli to nie tajemnica, to podeślij plik smile.gif


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
Beniooo
post 24.07.2012, 18:02:38
Post #11





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


ten który chce posortować?
http://www.gimkarpacz.xaa.pl/slowa-win.zip



Odświeżam, nadal nie działa

Ten post edytował Beniooo 24.07.2012, 18:02:22


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
toaspzoo
post 24.07.2012, 22:21:09
Post #12





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

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


Jakie kodowanie ma ten plik tekstowy ?


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
Beniooo
post 25.07.2012, 09:30:52
Post #13





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


ANSI


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
toaspzoo
post 26.07.2012, 17:32:03
Post #14





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

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


proszę http://sowa-mat.pl/sorter


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
Beniooo
post 26.07.2012, 17:50:45
Post #15





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


Dzięki Wielkie *.*


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
redeemer
post 26.07.2012, 19:54:32
Post #16





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Rozumiem Beniooo, że zmiana nazwy pliku w 3 linii mojego skryptu Cię przerosła?


--------------------
Go to the top of the page
+Quote Post
Beniooo
post 27.07.2012, 17:38:37
Post #17





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


redeemer, zmieniałem, nadal błąd wywalało ale z komunikatem (tried to allocate 16 bytes)


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 08:49