Topic: Pulizia memoria interprete python  (Letto 886 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.654
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Pulizia memoria interprete python
« Risposta #15 il: Gennaio 30, 2018, 09:29 »
con le curiosità di tutti stiamo andando ben oltre il problema alla mia domanda.


Senza uno stralcio di codice non è che si possa fare altrimenti. Riko ti ha spiegato perché cancellare moduli a caso non serve a nulla, tutti stanno proponendo soluzioni alternative o metodi per diagnosticare il problema vero (che verosimilmente non è che ci sono troppi moduli caricati, ma i dati che essi tengono in memoria).


Ho bisogno di pulire memoria ram mentre lavora questo programma, a fine di tutto, prima che ricomincia il ciclo da capo, Non esistono soluzioni?


Sì. Buttare il tutto e riavviare.


Il garbage collect ad esempio, se usato per bene può essermi di aiuto?


Il garbage collector non si usa.

Offline ytsejam

  • python habilis
  • **
  • Post: 99
  • Punti reputazione: 0
    • Mostra profilo
Re:Pulizia memoria interprete python
« Risposta #16 il: Gennaio 30, 2018, 11:17 »
Ok, allora abbandono tutto, a quanto pare non si può cancellare tutto, pulire ogni singola cosa dell' interprete senza uscire e riaprire per liberare memoria.

Grazie

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.870
  • Punti reputazione: 9
    • Mostra profilo
Re:Pulizia memoria interprete python
« Risposta #17 il: Gennaio 30, 2018, 12:36 »
> La mia situazione è come il rigo 28.

Questo non ha nessun senso in italiano. Vuoi dire che la tua situazione è come nel codice che ho scritto? Se sì, la soluzione è facile e ovvia da implementare.


> Il garbage collector non si usa.

Più precisamente: il gc si può usare e raffinare, all'occorrenza. Nel tuo caso, per quel che ha fatto notare riko, non servirebbe. Se stai *importando* mille moduli, il problema è che non dovresti importare mille moduli, e python non può aiutarti. Il che è senz'altro un limite di python. Ma appunto, dubito che nel tuo scenario questa sia davvero la fine della storia.


> Ok, allora abbandono tutto,

E' probabilmente la cosa migliore: se non sei abbastanza avanti nello studio di python da capire il problema e correggerlo, allora è senz'altro meglio che tu non metta le mani nel codice aziendale... rischieresti di fare più danni che altro.


> a quanto pare non si può cancellare tutto

Probabilmente no.
Ma ripeto, se la tua situazione è come nell'esempio che ho descritto, allora la soluzione dovrebbe essere ovvia e anche facile da implementare: non mettere i dati in moduli da importare, ma caricali da apposite "sorgenti di dati" (un database, un file json... quello che vuoi). Questo ti risparmia tutto il consumo di memoria "incancellabile" dovuto all'import. Come bonus, è anche una soluzione che puoi sperimentare in modo incrementale: puoi iniziare a sostituire uno o due moduli con altrettanti file json, poi se funziona procedi con dieci o venti, poi con cento o duecento. Magari alla fine ti resteranno una decina di casi intrattabili, dove non riesci a passare da un modulo a un file json perché hai bisogno di una logica ad-hoc specifica per quei dati, va a sapere. Ma appunto, dovrebbero restare una minoranza di casi.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Pulizia memoria interprete python
« Risposta #18 il: Gennaio 31, 2018, 00:53 »
In ogni caso non posso permettermi stravolgere il tutto, non sono a casa con un raspberry o altro che posso permettermi di fare prove, spegnere il pc e rinviare a quando mi va, bloccherei una produzione ed in ogni caso con le curiosità di tutti stiamo andando ben oltre il problema alla mia domanda.

Si, ma se la gente e' curiosa, chiede. Meglio cosi' che essere ignorati, no?

Oggettivamente la tua prima frase mi fa un po' di tristezza. Cioe'... siamo tutti in produzione, eh. E facciamo cambiamenti. Tutti i giorni. Solo che costruiamo le cose in modo che sia possibile farlo. Questo solo per dare contesto: io capisco che la tua situazione sia quella che descrivi. E' una situazione classica. Ma non pensare che sia l'unica realta' delle cose. E' una situazione (brutta) in cui vi trovate voi. In un certo senso vi ci siete messi da soli. Capita: imparate la lezione e fine. Cercate di uscirne perche' sarete piu' veloci. E non tentate di pezzare problemi chiaramente grossi a calci.

Citazione
Ho bisogno di pulire memoria ram mentre lavora questo programma, a fine di tutto, prima che ricomincia il ciclo da capo, Non esistono soluzioni?
Il garbage collect ad esempio, se usato per bene può essermi di aiuto?

No, non hai "bisogno di pulire la memoria ram". Hai bisogno di cominciare a non occuparla. E' estremamente meno complesso.
Dopo di che, il garbage collector (non "il garbage collect") non e' che fa magie. E' semplicemente il coso che fa si che ogni qualvolta crei un qualche oggetto (anche un numero) e quindi allochi memoria, tu non debba ricordarti di deallocarla. Questo fa. Libera memoria quando un oggetto non e' piu' utilizzato. Ora, io mi immagino che ti si stiano illuminando gli occhi: ho detto "liberare memoria". Purtroppo questo non ti aiuta particolarmente. In primo luogo, e' automatico e sta gia' succedendo. Tu non devi fare nulla, se non evitare di creare situazioni difficili (e avere una cattiva architettura non aiuta).

In secondo luogo, come avevo gia' spiegato, quando anche "liberi" la memoria questa non torna davvero indietro all'OS (se quello e' il problema). In generale Python se la chiede e la prossima volta che gliela chiedi, riusa quella invece che chiedere all'os nuova memoria. A volte questa cosa e' un problema. Capita. Ed e' diverso da quello che chiedi tu. E quando capita, le soluzioni sono limitate. La piu' semplice e brutale e' ammazzare i worker e cominciare da capo. Cosi' si parte con memoria pulita e tanti saluti. Ovviamente devi avere un servizio stateless (o avere un buon modo di persistere e ristorare lo stato; e avere poco stato e localizzato semplifica la vita; ancora una volta una buona architettura aiuta). Questa soluzione e' considerata sporca (nel senso che ammazzare i worker ogni tanto e' comunque una buona idea, ma non correggere quello che a questo punto si chiama memory leak e' un problema).

Tu potresti avere memory leak? Certo. Dovresti trovarli e aggiustarli. Pensa di "pulire" e' fallimentare. Il gc e' piuttosto bravo di suo. Se lo aiuti. Se non lo aiuti, finisce essere parecchio complicato farlo a mano.

Ma tu stai chiedendo una cosa specifica: scaricare i moduli. No. Non si puo'. E anche se scaricassi i moduli, resta il problema degli oggetti che sono stati creati.
Secondo me voi state facendo cose davvero bizzarre con quel software...