Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: duzy plik i wydajnosc
Forum PHP.pl > Forum > PHP
ActivePlayer
Mam plik: http://www.kurnik.pl/slownik/ wersja pod windowsa, po rozpakowaniu ~~35 mb, przekonwertowana do ascii.

i teraz:
  1. <?php
  2. $wyrazy = file('slowa-win.txt');
  3. foreach($wyrazy as $id => $val){
  4. $len = strlen($val);
  5. if($len<4 and $len>5){
  6. unset($wyrazy[$id]);
  7. }
  8. }
  9. shuffle($wyrazy);
  10. fwrite(fopen('slowa.txt', 'w'), implode("n", array_slice($wyrazy,0,750)));
  11. ?>


komentując 2 ostatnie linijki, skrypt uruchamia sie jakies 3 minuty... i jest okey... ale wywołując razem, 30 minut to mało... to nei jest kwestia slabego sprzetu.
strife
Może podziel ten plik na kilka mniejszych. Albo wczytuj plik porcjami... może to coś zmieni.

Pozdro!
dr_bonzo
Nie lepiej tego najpierw do bazy wrzucic?

  1. <?php
  2. fwrite(fopen('slowa.txt', 'w'), implode("n", array_slice($wyrazy,0,750)));
  3. ?>

Pewnie implode powoli dziala.
Nie lepiej zapisywac po linijce: foreach ( $slice )...?

PS.
  1. <?php
  2. if($len<4 and $len>5){
  3. unset($wyrazy[$id]);
  4. } 
  5. ?>

kiedy ten warunek bedzie prawdziwy?
Vengeance
użyj file_get_contents() a nie file()
dr_bonzo
W tym pliku sa slowa -- kazde w osobnej linijce, wiec
Cytat
użyj file_get_contents() a nie file()

Nic mu nie pomoze.

  1. <?php
  2. implode("n", array_slice($wyrazy,0,750)
  3. ?>

Niepotrzebnie dodajesz "\n" -- file() ich nie ucina.

moj kod:
  1. <?php
  2. $times = array();
  3. $times[] = array( '---', microtime( TRUE ) );
  4.  
  5. $in = 'slowa-utf8';//plik ze slowami (32 MB)
  6. $out = 'slowa-out'; // wynik
  7.  
  8. $lines = file( $in );
  9. $times[] = array( 'file', microtime( TRUE ) );
  10.  
  11. $slice = array_rand( $lines, 750 ); // przeciez tak mozna biggrin.gif zamiast shuffle i slice
  12. $times[] = array( 'shuffle'n'slice', microtime( TRUE ) );
  13.  
  14.  
  15. $outputFile = fopen( $out, 'w' );
  16.  
  17. foreach( $slice as $line )
  18. {
  19.     fwrite( $outputFile, $line );
  20. }
  21. fclose( $outputFile );
  22. $times[] = array( 'write', microtime( TRUE ) );
  23.  
  24.  
  25. for ( $i = 1; $i < count( $times ); $i++ )
  26. {
  27.     print( number_format( $times[ $i ][ 1 ] - $times[ $i - 1 ][ 1 ], 5 ) . ' / ' . $times[ $i ][ 0 ] . '<br />' );
  28. }
  29.  
  30. ?>


Wyniki na moim mega sprzeciochu (2xP3-500 + 512 MB + HDD ~ 25MB/s)

Kod
23.82346 / file
1.81372 / shuffle'n'slice
0.14638 / write

LOL?
a apache uzyl 60% pamieci biggrin.gif, ActivePlayer ile masz RAMu? moze system zaczal ci swapowac za bardzo.


----
edit: jednak implode nie ma tu nic do rzeczy -- 0.723s z implode, 0.17.. z petla i fwrite.
ActivePlayer
sempron 3k++ (1,8gzh) 512 ramu

zrobilem tak:
1. wlaczylem skrypt
2.poszedlem
3.przyszedlem
4. jest

ale nie mam pojecia dlaczego tak dlugo sie to robilo. moglem jakiegos timera włączyc, ale w sumie. jednorazowa operacja, wiec nie ma co analizowac. zastanawia mnie tylko... taaa sad.gif
  1. <?php
  2. if($len<4 and $len>5){
  3. unset($wyrazy[$id]);
  4. } 
  5. ?>


to juz wiem dlaczego tak dlugo sad.gif kurde... chyba odpuszcze z tymi dlugosciami... mialo byc or w tym warunku sad.gif
jono
Kiedyś stworzyłem skrypt sprawdzający pisownię. Chyba jedynym logicznym wyjściem jest podzielenie bazy słów na pliki a.txt, b.txt zawierające wyrazy które zaczynają się na daną literę. Działa szybko, a nawet dodałem do skryptu podpowiedzi jakie wyrazy można by uzyć. Jedyną wadą takiego rozwiązania jest to, że skrypt wariuje, kiedy błąd znajdzie się w pierwszej literze...
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.