2016-02-01 18 views
7

Sto cercando di utilizzare il connettore MySQL come alternativa a pymysql in quanto supporta più istruzioni in una query per alcuni aggiornamenti che devo fare (Here is my other question related to that) tuttavia non riesce per il mio altro caso di utilizzo di invio di istruzioni di selezione molto grandi.MySQL connector python 35 Risorsa temporaneamente non disponibile con query di grandi dimensioni?

Ho un'istruzione Select generata dinamicamente che recupera tutte le righe che corrispondono a uno dei valori specificati passati; per esempio Select * from table where col_a in (val_1, val_2.... val_350,000)

continuo a ricevere lo stesso errore per le mie istruzioni select:

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 

Questo accade a prescindere se ho comprimere = True o False. Inoltre, non penso che questo sia un problema lato server, come ho già detto, le stesse istruzioni Select sembrano funzionare con pymysql in esecuzione con lo stesso codice e la stessa macchina.

Qualche idea su come posso aggirare questo?

+0

Dove stai ottenendo i valori 350k nei parametri dall'inizio? Il database? –

+0

No, ho un file di testo non elaborato che ho ricevuto (sono sempre diversi) e ho bisogno di estrarre le rispettive righe dal DB per fare alcune trasformazioni e aggiornamenti usando altri dati grezzi. –

+0

@RyanVincent Potrei ed è un lavoro in giro che ho ma aggiunge più codice che in realtà non dovrebbe essere lì a mio parere. Ciò che mi dà fastidio è che so che il DB può gestirlo e so che Python può gestirlo perché funziona con PyMYSQL quindi è frustrante non sapere perché non funziona con la libreria di connettori 1) Dividere i valori in gruppi di 40.000 2) Costruire numero N di query e effettuare chiamate 3) Unione dei risultati insieme –

risposta

3

Non costruire l'orrendo IN(...), invece gettare i valori in una tabella, uno per riga.

Quindi fare un JOIN nella tabella reale per ottenere le righe necessarie. (Assicurati che l'indice col_a sia indicizzato nella tabella reale; non preoccuparti di indicizzarlo nella tabella aggiuntiva.)

Se l'elenco enorme può avere duplicati, è probabilmente necessario deselezionare l'elenco per primo. Vedi se Python può farlo abbastanza facilmente. In caso contrario, è possibile che quella colonna sia la PRIMARY KEY e la INSERT IGNORE come si inseriscono. Oppure,

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

Apprezzo la risposta, Prenderò in considerazione questo nuovo desgin e lo implementerò. Tuttavia questo solleva un nuovo problema. Ogni volta che provo a fare un 'LOAD DATA LOCAL INFILE' ottengo un errore Broken Pipe ' File "/usr/local/lib/python3.4/dist-packages/pymysql/connections.py", riga 986, in _write_bytes self.socket.sendall (dati) BrokenPipeError: [Errno 32] Tubo rotto raise err.OperationalError (2006, "Il server MySQL è andato via (% r)"% (e,)) pymysql.err.OperationalError: (2006, "Il server MySQL è andato via (BrokenPipeError (32, 'Broken pipe'))") ' –

+0

Controlla' wait_timeout', 'interactive_timeout', disco pieno, problema di rete,' tmpdir' su un piccolo file system. –

+0

Ora sto ottenendo 'mysql.connector.errors.OperationalError: 2055: Connessione persa al server MySQL a 'c200-aurora.cluster-cdiuhkskfb4l.us-east-1.rds.amazonaws.com:3306', errore di sistema: 35 Risorsa temporaneamente non disponibile' di nuovo quando si tenta di caricare i dati LOCAL INFILE e succede solo a volte. Ho provato la stessa istruzione Load da mysql workbench e non ho mai ricevuto l'errore ...proprio quando lo chiamo da Python. –

Problemi correlati