2016-02-01 8 views
7

Próbuję użyć konektora MySQL jako alternatywy dla pymysql, ponieważ obsługuje on wiele instrukcji w jednym zapytaniu dla niektórych aktualizacji, które muszę wykonać (Here is my other question related to that), ale zawiedzie dla mojego innego przypadku użycia wysyłania bardzo dużych instrukcji wyboru.Python złącza MySQL 35 Zasób tymczasowo niedostępny przy dużych zapytaniach?

Mam generowane dynamicznie polecenie Select, które pobiera wszystkie wiersze pasujące do którejkolwiek z podanych wartości; na przykład Select * from table where col_a in (val_1, val_2.... val_350,000)

wciąż otrzymuję ten sam błąd na moich wybranych stwierdzeń:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mysql/connector/network.py", line 212, in send_compressed 
    self.sock.sendall(zip_packet) 
BlockingIOError: [Errno 35] Resource temporarily unavailable 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 921, in _bootstrap_inner 
    self.run() 
    File "/Users/maldeiri/raw_data_processing/sql_retriever.py", line 22, in run 
    self.mysql_cursor.execute(self.sql_statement) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mysql/connector/cursor.py", line 515, in execute 
    self._handle_result(self._connection.cmd_query(stmt)) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mysql/connector/connection.py", line 488, in cmd_query 
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mysql/connector/connection.py", line 261, in _send_cmd 
    packet_number) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mysql/connector/network.py", line 215, in send_compressed 
    errno=2055, values=(self.get_address(), _strioerror(err))) 
mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at 'database_end_point:3306', system error: 35 Resource temporarily unavailable 

Dzieje się tak niezależnie od tego czy mam skompresować = True lub False. Też nie sądzę, że to jest problem po stronie serwera, ponieważ wspomniałem, że dokładnie te same instrukcje Select wydają się pracować z pymysql z uruchomionym tym samym kodem i maszyną.

Jakieś pomysły, jak sobie z tym poradzić?

+0

Skąd czerpiesz wartości 350k w parametrach? Baza danych? –

+0

Nie, mam surowy plik tekstowy, który otrzymuję, który je ma (są one zawsze różne) i muszę wyciągnąć odpowiednie wiersze z bazy danych, aby wykonać pewne transformacje i aktualizacje przy użyciu innych nieprzetworzonych danych. –

+0

@RyanVincent Mogłem i jest to praca wokół mnie, ale dodaje więcej kodu, który naprawdę nie powinien być w mojej opinii. Martwi mnie to, że wiem, że DB może sobie z tym poradzić i wiem, że Python może sobie z tym poradzić, ponieważ działa za pomocą PyMYSQL, więc frustrujące jest nie wiedzieć, dlaczego nie działa z biblioteką łączników 1) Dzielenie wartości w grupach 40 000 2) Zbudowanie liczby zapytań N i wykonanie połączeń 3) Połączenie wyników razem –

Odpowiedz

3

Nie buduj tego przerażającego IN(...), zamiast tego rzucaj wartości do tabeli, po jednej w wierszu.

Następnie wykonaj JOIN do rzeczywistego stołu, aby uzyskać potrzebne wiersze. (Upewnij się, że col_a jest indeksowany w prawdziwej tabeli, nie przejmuj się indeksowaniem go w dodatkowej tabeli.)

Jeśli na wielkiej liście mogą znajdować się dupki, prawdopodobnie powinieneś najpierw odrzucić listę. Sprawdź, czy Python może to zrobić wystarczająco łatwo. Jeśli nie, możesz umieścić tę jedną kolumnę jako PRIMARY KEY i zrobić INSERT IGNORE podczas wstawiania. Lub,

CREATE TABLE t (val) ENGINE=MyISAM; 
INSERT or LOAD DATA ... (no dedupping) 
SELECT rt.* FROM real_table 
    JOIN (SELECT DISTINCT val FROM t) ON rt.val = t.val; 
+0

Doceniam odpowiedź, Zastanowię się nad tym nowym desginem i wdrożę go. Jednak pojawia się nowy problem. Za każdym razem, gdy próbuję wykonać polecenie LOAD DATA LOCAL INFILE, otrzymuję komunikat o błędzie zepsutym 'Plik" /usr/local/lib/python3.4/dist-packages/pymysql/connections.py ", wiersz 986, w _write_bytes self.socket.sendall (dane) BrokenPipeError: [Errno 32] Uszkodzona rura podniesiona err.OperationalError (2006, "Serwer MySQL zniknął (% r)"% (e,)) pymysql.err.OperationalError: (2006, "Serwer MySQL odszedł (BrokenPipeError (32," Broken pipe "))") ' –

+0

Sprawdź' wait_timeout', 'interactive_timeout', pełny dysk, problem z siecią,' tmpdir' na małym systemie plików. –

+0

Teraz dostaję 'mysql.connector.errors.OperationalError: 2055: Utracono połączenie z serwerem MySQL na 'c200-aurora.cluster-cdiuhkskfb4l.us-east-1.rds.amazonaws.com:3306', błąd systemu: 35 Zasoby czasowo niedostępne 'ponownie podczas próby załadowania danych LOCAL INFILE i zdarza się to tylko czasami. Próbowałem tej samej instrukcji Load z mysql workbench i nigdy nie dostałem błędu ...właśnie wtedy, gdy nazywam to z Pythona. –

Powiązane problemy