2013-12-15 13 views
6

Ero abituato a eseguire python a 32 bit su un sistema operativo a 32 bit e ogni volta aggiungevo accidentalmente valori a un array in un elenco infinito o tentavo di caricare un file troppo grande Python si fermerebbe semplicemente con un errore di memoria insufficiente. Tuttavia, ora utilizzo python a 64 bit su un sistema operativo a 64 bit, e invece di dare un'eccezione, python utilizza fino all'ultimo frammento di memoria e causa il blocco del mio computer, quindi sono costretto a riavviarlo.python a 64 bit riempie la memoria fino a quando il computer si blocca senza memerror

Ho guardato intorno allo stack overflow e non sembra che ci sia un buon modo per controllare l'utilizzo della memoria o limitare l'utilizzo della memoria. Ad esempio, questa soluzione: How to set memory limit for thread or process in python? limita le risorse che python può utilizzare, ma sarebbe poco pratico incollare in ogni pezzo di codice che voglio scrivere.

Come posso evitare che ciò accada?

+0

Quale sistema operativo? Quanto spazio di swap hai? – mgilson

+0

@mgilson Windows 8. Non sono sicuro di quale spazio di swap sia perché sembra essere applicabile a Linux secondo Google. – shimao

+1

È possibile aggiungere la stanza per impostare il limite di memoria nel file 'PYTHONSTARTUP', che sarebbe di aiuto quando si eseguono le operazioni. http://stackoverflow.com/a/5837597/148870 – Amber

risposta

1

Non so se questa sarà la soluzione per chiunque altro tranne me, poiché il mio caso era molto specifico, ma ho pensato di pubblicarlo qui nel caso qualcuno potesse usare la mia procedura.

Avevo un set di dati MOLTO enorme con milioni di righe di dati. Una volta interrogato questi dati attraverso un database PostgreSQL ho esaurito gran parte della mia memoria disponibile (63,9 GB disponibili in totale su un PC Windows 10 64 bit usando Python 3.x 64 bit) e per ognuna delle mie query che ho usato in giro 28-40 GB di memoria in quanto le righe di dati dovevano essere conservate in memoria mentre Python eseguiva i calcoli sui dati. Ho usato il modulo psycopg2 per connettermi al mio postgreSQL.

La mia procedura iniziale era di eseguire calcoli e quindi di aggiungere il risultato a un elenco che avrei restituito nei miei metodi. Ho rapidamente finito per avere troppa memoria in memoria e il mio PC ha iniziato a dare di matto (bloccato, mi ha disconnesso da Windows, il driver del display ha smesso di rispondere e così via).

Pertanto ho cambiato il mio approccio utilizzando Python Generators. E poiché vorrei memorizzare i dati che ho eseguito sul mio database, scriverò ogni riga, dato che ho eseguito calcoli su di essa, nel mio database.

def fetch_rows(cursor, arraysize=1000): 
    while True: 
     results = cursor.fetchmany(arraysize) 
     if not results: 
      break 
     for result in results: 
      yield result 

E con questo approccio che vorrei fare calcoli sul mio risultato ceduto utilizzando il mio generatore:

def main(): 
    connection_string = "...." 
    connection = psycopg2.connect(connection_string) 
    cursor = connection.cursor() 

    # Using generator 
    for row in fecth_rows(cursor): 
     # placeholder functions 
     result = do_calculations(row) 
     write_to_db(result) 

Questa procedura ha tuttavia anzi richiede di avere abbastanza RAM fisica per memorizzare i dati in memoria.

Spero che questo aiuti chi sta là fuori con gli stessi problemi.

Problemi correlati