Ho scritto circa 50 classi che uso per connettermi e lavorare con i siti web usando meccanize e threading. Funzionano tutti contemporaneamente, ma non dipendono l'uno dall'altro. Questo significa 1 sito web in classe 1 - 1 thread. Non è una soluzione particolarmente elegante, soprattutto per la gestione del codice, poiché molte code si ripetono in ogni classe (ma non abbastanza per trasformarlo in una classe per passare argomenti, poiché alcuni siti potrebbero richiedere un'ulteriore elaborazione dei dati recuperati nel mezzo di metodi - come "login" - che altri potrebbero non aver bisogno). Come ho detto, non è elegante, ma funziona. Inutile dire che accolgo con favore tutti i consigli su come scrivere meglio senza utilizzare 1 classe per ciascun approccio del sito. L'aggiunta di funzionalità aggiuntive o la gestione generale del codice di ogni classe è un'attività scoraggiante.Come ridurre l'utilizzo della memoria del codice Python filettato?
Tuttavia, ho scoperto che ogni thread richiede circa 8 MB di memoria, quindi con 50 thread in esecuzione stiamo considerando circa 400 MB di utilizzo. Se fosse in esecuzione sul mio sistema non avrei problemi con quello, ma dal momento che è in esecuzione su un VPS con solo 1 GB di memoria, sta iniziando a essere un problema. Puoi dirmi come ridurre l'utilizzo della memoria o ci sono altri modi per lavorare contemporaneamente con più siti?
Ho usato questo programma di prova rapido per verificare se sono i dati memorizzati nelle variabili della mia applicazione che sta utilizzando la memoria, o qualcos'altro. Come puoi vedere nel codice seguente, è solo l'elaborazione della funzione sleep(), ma ogni thread utilizza 8 MB di memoria.
from thread import start_new_thread
from time import sleep
def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise
def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper,())
n += 1
if not (n % 50):
print n
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n
if __name__ == '__main__':
test()
Quando si esegue questa operazione, il risultato è:
50
100
150
Exception raised: can't start new thread
Biggest number of threads: 188
E rimuovendo running = False
linea, posso quindi misurare memoria libera usando free -m
comando nella shell:
total used free shared buffers cached
Mem: 1536 1533 2 0 0 0
-/+ buffers/cache: 1533 2
Swap: 0 0 0
L'attuale calcolo perché so che ci vogliono circa 8 MB per thread è quindi semplice dividendo dividendo la differenza di memoria utilizzata prima e durante l'applicazione di test sopra è runnin g, diviso per i thread massimi che è riuscito a iniziare.
Probabilmente è solo allocata memoria, perché guardando top
, il processo python utilizza solo circa lo 0,6% della memoria.
Cosa sta occupando la memoria? Mi azzarderei a indovinare che sono i dati che stai estraendo dai siti. Se questo è il caso, probabilmente non c'è molto che potresti fare a meno di limitare il numero di thread in esecuzione. –
Come si misura esattamente l'utilizzo della memoria? Direi che quegli 8 MB non sono realmente assegnati a ogni singolo thread. Una parte enorme di questi 8 MB può essere condivisa tra i thread (solo una supposizione ..)? – Frunsi
Demian and frunsi, ho modificato la mia domanda per rispondere a entrambe le vostre domande. Grazie! – Gargauth