Jak zmienic ten kod na szybszy?

Odpowiedz Nowy wątek
2019-02-10 13:16
0

Witam,
Mam tutaj proste wczytywanie pliku:

with open("scan/scan.txt") as file:
        for line in file:
                check(line)

Problem jest taki ze plik ma ok 50000 linijek.
Jak można usprawnić ten kod zeby działał szybciej? Multiprocessing? Nigdy nie robiłem programu który wykorzystuje multi threading-processing.

Pozostało 580 znaków

2019-02-10 16:13
0

W sumie to niby ustaliliśmy już z @lion137, że co benchmark to inny wynik, ale spróbuj pomierzyć czasy wykonania poszczególnych fragmentów funkcji check() i wrzuć jej kod źródłowy - i przy okazji zmierz lub sprawdź w logach (jeśli masz dostęp), ile trwa przetworzenie pojedynczego żądania na serwerze. Łatwiej będzie ustalić, co najbardziej spowalnia, ale jeśli w każdym kroku pętli

  • łączysz się z serwerem,
  • wysyłasz komunikat,
  • odbierasz odpowiedź,
  • kończysz połączenie

To pewnie masz narzut jak skurczybyk na komunikację ;)


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)
edytowany 2x, ostatnio: superdurszlak, 2019-02-10 16:15

Pozostało 580 znaków

2019-02-10 16:55
0

Chodziło mi bardziej o to nie żeby nawalać 50000 linijek do serwera, tylko np po 10. Tylko mi się udało na raz, tylko że miałem dosłownie 10 konsol odpalonych z tym samym programem a to mija się z celem. No i oczywiście wszystkie wysyłały pierwsze 10 linijek a nie kolejne 10.
@superdurszlak funkcji check niestety nie moge wrzucić, ale zajmuje ona tyle ile zajmuje serwerowi odpowiedzenie na zapytanie. W przypadku mojego serwera jest to 10-20sekund.

edytowany 1x, ostatnio: Adrian Rudy Dacka, 2019-02-10 16:59

Pozostało 580 znaków

2019-02-10 17:01
1
Adrian Rudy Dacka napisał(a):

Chodziło mi bardziej o to nie żeby nawalać 50000 linijek do serwera, tylko np po 10.
Tylko mi się udało na raz, tylko że miałem dosłownie 10 konsol odpalonych z tym samym programem a to mija się z celem. No i oczywiście wszystkie wysyłały pierwsze 10 linijek a nie kolejne 10.

A co to właściwie miało na celu?

Chcesz wysłać ten plik na serwer w kilku kolejnych paczkach, czy interesuje Cię tylko jakIś fragment pliku? Co dokładnie ma robić ten check, a właściwie to serwer?


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)

Pozostało 580 znaków

2019-02-10 17:04
0
[Adrian Rudy Dacka napisał(a)](p

@superdurszlak funkcji check niestety nie moge wrzucić, ale zajmuje ona tyle ile zajmuje serwerowi odpowiedzenie na zapytanie. W przypadku mojego serwera jest to 10-20sekund.

No to problemem jest komunikacja lub wydajność serwera, spróbuj wysłać wszystko w jednym lub kilku batchach i/lub wyciągnąć łączenie z serwerem poza pętlę i podtrzymywać jedno do całości komunikacji, jeśli pod spodem już tak nie jest i/lub wsadzić wszystko w pulę procesów żeby sprawdzić czy nie wyczerpałeś możliwości sieci lub serwera. Najlepiej po 1 zmianie naraz i mierz zmiany w czasie wykonania.

Btw. 10s to czas odpowiedzi na 50 000 zapytań czy jednego? (sic!)


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)
edytowany 2x, ostatnio: superdurszlak, 2019-02-10 17:06

Pozostało 580 znaków

2019-02-10 17:05
0

Ja wysyłam zapytania json zaware w pliku (jedno na linijke) a serwer zwraca jakiś inny json.I w tym problem bo na odpowiedź czekam między 10-20sekund w zależność od prędkości mojego internetu. Dlatego chciałem wczytując linie, wysyłać na przykład po 10 zapytań jednocześnie(Czyli 10 linijek),czekać np 1 minutę a potem wysłać następne 10.
EDIT:
Dodam że funkcja potem nic nie zwraca tylko zapisuje odpowiedz do pliku.

edytowany 1x, ostatnio: Adrian Rudy Dacka, 2019-02-10 17:10

Pozostało 580 znaków

2019-02-10 17:10
0
Adrian Rudy Dacka napisał(a):

Dlatego chciałem wczytując linie, wysyłać na przykład po 10 zapytań jednocześnie(Czyli 10 linijek),czekać np 1 minutę a potem wysłać następne 10

A mierzyłeś czas odpowiedzi, gdy jedno żądanie zawiera więcej linii? Może wtedy wyniesie nie 1min, a 21s?

Jeśli winne jest połączenie internetowe, to multiprocessing nic nie da, skoro już jeden proces może je zapchać.

I dobrze by było, gdybyś jednak ujawnił więcej szczegółów, zrobił pomiary dla wielu scenariuszy i dał wyniki, bo tak to wróżymy ze szklanej kuli :p


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)

Pozostało 580 znaków

2019-02-10 17:13
0

Funkcja check:

def check(line):
   url = "XXX"
   data = {"jsonrpc":"2.0","method":line,"params":[],"id":1}
   headers = {'Content-type': 'application/json'}
   rsp = requests.post(url, json=data, headers=headers,timeout=10)
   if "X" in rsp:
     with open("results.txt",'a') as file:
       file.write("\n"+rsp)

I nie chodzi mi o to żeby wysyłać 10 linijek w jednym zapytaniu tylko 10 w osobnych czyli wczytuje plik linia po lini i wywołuje dla każdej check(line). Jeżeli działa akurat 10 wątków to czekam aż któryś się zakończy i wtedy uruchamiam następny z następną linia.
Przykład:

with open("scan/scan.txt") as file:
        for line in file:
                Jezeli 10 wątków istnieje to czekaj na zakonczenie jakiegoś, jeżeli jest mniej niż 10 to zacznij następny check(line)
edytowany 8x, ostatnio: Adrian Rudy Dacka, 2019-02-10 17:24

Pozostało 580 znaków

2019-02-10 17:26
0

Panie Adrianie, Pana problem polega właśnie na tym, że nie chce Pan wysyłać 10 linijek w jednym zapytaniu.

Dodatkowo, if "X" in rsp: się zapewne nigdy nie wykona - zwraca on bowiem listę obiektów typu bytes, gdzie każdy obiekt to 128 znaków (lub mniej, gdy już się dotrze do końca). Tak więc, jeśli być może pracujesz na Pythonie 2, to sprawdzenie nie miałoby problemów z typem, natomiast i tak musiałbyś mieć w odpowiedzi dokładnie jedną linijkę z treścią "X", co by zupełnie przeczyło potrzebie zapisania czegoś takiego to pliku (bo nie jesteś w stanie tego skojarzyć z argumentem przesyłanym do funkcji check).

edytowany 3x, ostatnio: enedil, 2019-02-10 17:31

Pozostało 580 znaków

2019-02-10 17:37
0

Panie Adrianie, Pana problem polega właśnie na tym, że nie chce Pan wysyłać 10 linijek w jednym zapytaniu
Akurat nie mogę wysłać 10 linijek gdyż nie każda idzie do jednego serwera. Jest to tylko fragment funkcji check. Niektóre linijki zawierające konkretną wartość idą na inny serwer a inne na inny,funkcja check przed wysłaniem je dzieli i wysyła na serwer.
Dodatkowo, if "X" in rsp: się zapewne nigdy nie wykona
Tutaj akurat mój błąd. Powinno być rsp.text a nie rsp.

Pozostało 580 znaków

2019-02-10 17:38
0

Panie Adrianie, Pana problem polega właśnie na tym, że nie chce Pan wysyłać 10 linijek w jednym zapytaniu

Akurat nie mogę wysłać 10 linijek gdyż nie każda idzie do jednego serwera. Jest to tylko fragment funkcji check. Niektóre linijki zawierające konkretną wartość idą na inny serwer a inne na inny,funkcja check przed wysłaniem je dzieli i wysyła na serwer.

Dodatkowo, if "X" in rsp: się zapewne nigdy nie wykona

Tutaj akurat mój błąd. Powinno być rsp.text a nie rsp.

edytowany 2x, ostatnio: Adrian Rudy Dacka, 2019-02-10 17:38
Czyli funkcja check, nie robi tego na co wskazuje nazwa :D. Dlatego nie dziw się że od początku ktoś źle cię rozumiał :) - Guaz 2019-02-12 12:50

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0