![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 223 Pomógł: 27 Dołączył: 16.04.2008 Skąd: Bakutilu Ostrzeżenie: (0%) ![]() ![]() |
Mam 2 tablice:
1.
2.
Chce porównać obie tablice tak aby zwróciło wszystkie numery z tablicy 1 których nie ma w tablicy 2. Próbowałem z array_diff_assoc ale nie działa. Robiłem też w pętli foreach ale skrypt przerywa działanie i nie wywala żadnego błędu. I co najważniejsze w tablicy nr 1 jest ponad 80 000 kluczy (razy 2 [Knt_Telefon1] i [Knt_Telefon2]) oraz w tablicy nr 2 jest około 70 000 rekordów. Da się to jakoś optymalnie rozegrać? Ten post edytował styryl 24.10.2011, 13:06:27 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
1. Wygeneruj sobie druga tablicę tak aby wyglądała w ten sposób:
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli robisz to jednorazowo to nie ma co za bardzo kombinowac z optymalnością. Sugeruje dać set_time_limit na duży i większy przydział pamięci jeżeli jest potrzebny (IMG:style_emoticons/default/wink.gif)
Co do kodu spróbuj po prostu:
Proste, chwilę potrwa ale powinno działać HTH! (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 223 Pomógł: 27 Dołączył: 16.04.2008 Skąd: Bakutilu Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie, @ephirus - próbowałem w podobny sposób jednak nagle po sprawdzeniu około 30-35 tyś kluczy przestawało działać (zero błędu przy czym limity czasowe i pamięciowe ściągnięte). Puściłem kod CuteOne i się póki co mieli.
Co do częstotliwości to mniej więcej musi chodzić co tydzień. Ten post edytował styryl 24.10.2011, 13:54:29 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To takie dodatkowe info - żeby wiedzieć co się dzieje w danej chwili zawsze możesz co jakiś czas (co ileś operacji sprawdzania) dać loga. To znaczy nadpisać plik z info, ile rekordów przemieliło itd... Wtedy jak coś się skrzaczy masz info kiedy i jak dobrze to napiszesz także "dlaczego" (IMG:style_emoticons/default/wink.gif) Ja tak kiedyś skasowałem sporą bazę bo mi się jedna literka pomyliła ;P (backup był) (IMG:style_emoticons/default/tongue.gif)
P.S. Pamiętam też, że w zależności od ustawień serwera może nie działać ustalanie czasu trwania skryptu - serwer ustawia to wedlug siebie - spotkałem się z tym w Nginx na przykład - więc jak nic nie pomoże to sprawdź też czy Ci po prostu serwer na "chama" skryptu nie killuje (IMG:style_emoticons/default/wink.gif) Ten post edytował Sephirus 24.10.2011, 14:03:58 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
Wyszukiwanie różnic w dwóch tablicach po ~100 000 elementów nie powinno trwać aż tak długo, żeby można było powiedzieć "póki co się mieli". Żeby przyspieszyć działanie takiego skryptu trzeba zastosować hashtablice (wyszukiwanie elementów w hashtablicy jest znacznie szybsze, niż porównywanie po kolei n elementów zwykłej tablicy). Jako że w PHP tablice asocjacyjne mogą być traktowane jako hashtablice, to kod jest bardzo prosty. W praktyce sprowadza się do tego, co pokazali CuteOne i Sephirus, tyle że klucze tablic zamienione są z wartościami:
Wygenerowałem sobie tablice 1 i 2 zawierające odpowiednio 70 000 i 80 000 elementów (za telefony przyjąłem wartości losowe z zakresu 320000000 - 329999999) i powyższy kod wykonuje się u mnie w 0.75 sekundy i zajmuje w szczytowym momencie niecałe 80MB pamięci. PS. Jeśli ma się to wykonywać raz, lub raz na tydzień jakoś w nocy, to faktycznie nie trzeba się przejmować wydajnością. W przeciwnym wypadku warto się nad tym zastanowić, bo wzrost wydajności jest znaczny. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 16:57 |