Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-01-2015, 20:26   #1
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
[Python] Multiprocessing e condivisione di oggetti read-only

Salve, ho un problema con Python.
Ho implementato un algoritmo genetico usando Deap, ma questo non è importante. L'algoritmo funziona, purtroppo però la versione multi-processo ha un problema, consuma molta più memoria della versione single-process.
Immagino che l'utilizzo esagerato della memoria sia dovuto al fatto che viene allocata memoria per ogni processo così da poter caricare gli oggetti che poi verranno usati.

Questo è sbagliato perché gli oggetti che vengono usati vengono soltanto letti dai diversi processi, quindi potrebbero benissimo essere condivisi così da risparmiare memoria.

Questa è la struttura del codice che ho scritto. Dovrei passare l'oggetto Dataset ai singoli processi.
Codice:
def evaluate(individual, dataset=None):

    penalty = dataset.compute(individual)

    return penalty


def initialize():
   dataset = dataset(file1, file2)

   pool = multiprocessing.Pool()
   toolbox.register("map", pool.map)

   toolbox.register("evaluate", evaluate, dataset=dataset)

   return toolbox, dataset


def main():
   toolbox, dataset = initialize()

   dataset.data = some_training_set

   fitnesses = toolbox.map(toolbox.evaluate, population)

   dataset.data = some_validation_set

   fitnesses = toolbox.map(toolbox.evaluate, population)
Questa è la classe Dataset che contiene il dataset appunto, il quale viene letto da csv con pandas e un dizionario.
Codice:
class Dataset:

    def __init__(self, file1, file2):
        self.data = read(file1)
        self.dict = loadpickle(file2)

    def compute(self, individual):
       for row in self.data
           # some stuff reading row and self.dict
Qual è il modo più semplice di passare l'oggetto Dataset ai vari processi, senza che ne vengano fatte diverse copie?
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 21:08   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Purtroppo è un casino. Forse questa soluzione su StackOverflow può aiutarti.

EDIT. Ecco un altro articolo interessante sull'argomento.
EDIT2: altri due risposte (qui e qui) su SO, correlate, ma la musica mi sembra la stessa.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys

Ultima modifica di cdimauro : 16-01-2015 alle 21:11.
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 21:19   #3
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Ti ringrazio per i link, però avevo già dato un'occhiata su Stack Overflow, ma da solo non sono riuscito a trovare una soluzione. Ho da poco iniziato a studiare Python e non sono molto esperto di multi-processing.

Possibile che è così complicato? In fondo, devo semplicemente leggere quegli oggetti, non ho problemi di sincronizzazione o altro... Implementare una versione multithread sarebbe possibile? Avrebbe le stesse performance? Da quello che leggo in giro non sembra essere molto conveniente...

Ultima modifica di oNaSsIs : 16-01-2015 alle 21:23.
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 21:32   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Col multithreading risolvi sicuramente, perché non hai bisogno di farti copia alcuna, come avviene invece normalmente col multiprocessing (a meno di usare il suo tipo Array, come hai potuto leggere, ma con tutte le problematiche del caso).

Soprattutto se si tratta di oggetti "a sola lettura", col multithreading non hai alcun problema di condivisione.

Il problema del modulo threading è, però, che fa uso di un solo core, come penso tu sappia, causa presenza della famigerata GIL.

Se il tuo algoritmo è I/O bound, non penso che ciò sia un problema. Anzi, così viene sfruttato per bene il singolo core. Ma se devi fare "number crunching", allora ti scontrerai con questa enorme limitazione.

In alternativa, se potessi suddividere i dati in parti diverse (file o mmap), e fargliele leggere poi ai singoli processi, probabilmente potresti anche risolvere. E' una tecnica che ho usato tempo addietro, quando dovevo sfruttare tutti i core, ma distribuire un certo insieme di numeri: li ho partizionati in un certo modo, e poi dato in pasto ogni blocco a un ben preciso processo.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 21:47   #5
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Trattandosi di un algoritmo genetico devo valutare la bontà di una soluzione e per fare ciò devo leggere dei dati. Per ottimizzare ho pensato di fare queste valutazioni in parallelo perché indipendenti. Credo che per avere un notevole incremento delle performance ho bisogno per forza del multiprocessing.

Ma è davvero così complicato riuscire a leggere un csv e condividerlo tra i processi? Non è che riusciresti ad aiutarmi? Io ho letto di tutto in giro, multiprocessing.Value, multiprocessing.Array, Manager.... ma davvero non riesco a venirne a capo.

EDIT: Qui ad esempio suggeriscono di usare il Manager.

Ultima modifica di oNaSsIs : 16-01-2015 alle 21:57.
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 22:00   #6
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Se i dati del CSV li puoi partizionare, potresti risolvere in questo modo, fornendo a ogni processo del pool soltanto ciò che deve processare.

Ho lavorato poco col multiprocessing, per cui oltre a ciò che ho scritto non mi viene in mente altro usando questo strumento.

Un'altra soluzione potrebbe essere quella di usare mmap e la classica fork per creare i vari processi. Nella documentazione del modulo mmap c'è qualche esempio in merito.

Oltre a questo... I give-up.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 22:07   #7
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Non posso partizionare il file.
Ti ringrazio lo stesso per l'aiuto.
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2015, 22:20   #8
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Ho visto adesso il tuo edit. Il Manager sembra poter risolvere il tuo problema.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2015, 13:35   #9
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12869
Teoricamente se sei sotto un sistema operativo tipo Linux, e il multi-processing sfrutta il forking, finché non tocchi le pagine di memoria che contengono i dati questi non vengono copiati dal padre al figlio (Copy On Write).

Se riesci ad organizzare i dati in maniera che siano esattamente in pagine di memoria separate (sotto Linux la dimensione di una pagina standard sono 4K), forse te la puoi cavare sfruttando questo meccanismo (a patto ripeto che le pagine non vegano "sporcate" con nuove scritture).

Dopodiché bisognerebbe effettivamente vedere come si comporta Python con quella memoria, non so che controllo puoi avere da quel punto di vista.

Chiaramente rimane un trick ad-hoc, in generale non puoi assumere questo comportamento su altri sistemi (anche se penso che ormai tutti i sistemi operativi moderni adottino tecniche di questo tipo).

Ultima modifica di WarDuck : 18-01-2015 alle 13:38.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2015, 17:26   #10
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Il problema è che, col meccanismo del reference counting usato in CPython, le pagine verranno copiate inevitabilmente al primo accesso, che sia in lettura o scrittura è indifferente, degli oggetti condivisi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2015, 19:19   #11
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
@oNaSsIs: m'è venuto in mente che potresti provare con PyPy, che non ha né GIL né reference counting, e in più ha un ottimo JIT per accelerare, e pure di molto, le prestazioni.

L'ho già usato diverse volte, alcune anche in produzione, e s'è comportato benissimo finora.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2015, 09:10   #12
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Non puoi caricare i dati in una Queue o in una Pipe condivisa?
https://docs.python.org/3.4/library/...rocessing.html
Oppure leggere un pezzetto di file con ogni processo...
http://www.tutorialspoint.com/python/file_seek.htm
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2015, 13:10   #13
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Il problema è che, col meccanismo del reference counting usato in CPython, le pagine verranno copiate inevitabilmente al primo accesso, che sia in lettura o scrittura è indifferente, degli oggetti condivisi.
Avevo letto questa cosa, spesso come risposta a chi suggeriva di usare variabili globali. :/

Quote:
Originariamente inviato da cdimauro
@oNaSsIs: m'è venuto in mente che potresti provare con PyPy, che non ha né GIL né reference counting, e in più ha un ottimo JIT per accelerare, e pure di molto, le prestazioni.
Ottimo suggerimento. Purtroppo non posso applicarlo nel mio caso perché ho verificato che PyPy non supporta Numpy.

Quote:
Originariamente inviato da Ingframin
Oppure leggere un pezzetto di file con ogni processo...
Teoricamente si, praticamente no. Non devo caricare solo il dataset ma anche dei dizionari piuttosto grandi. Il dataset viene letto e riletto migliaia di volte, quindi avevo pensato di caricarlo tutto in memoria per ottenere performance migliori. Infine ci sono altri piccoli problemi legati ai meccanismi di sampling del dataset.

Quote:
Originariamente inviato da Ingframin
Non puoi caricare i dati in una Queue o in una Pipe condivisa?
Questa potrebbe essere un'idea molto interessante. Ma ho due domande, la prima è come passare la Queue/Pipe. Direttamente al Pool, che poi la passerà ai vari processi? Ma soprattutto i processi quando hanno la Queue/Pipe, come dovrebbero gestirla? Da quello che ho visto essendo progettata per altri scopi, ogni volta che viene preso un oggetto questo viene rimosso. Cosa dovrei fare rimettere ogni volta dentro una copia dell'oggetto?
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2015, 07:07   #14
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Credo proprio di sì. Tanto una copia dell'oggetto in Python è soltanto una reference.

Riguardo a PyPy, so che al momento supporta un sottoinsieme di NumPy, per cui potrebbe anche essere sufficiente per quel che ti serve.

Altre possibili soluzioni: IronPython e Jython, che implementano Python per .NET e JVM rispettivamente, e che fanno uso di tutti i core perché internamente si occupano loro della protezione delle loro strutture dati e della sincronizzazione / condivisione.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2015, 19:12   #15
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Grazie mille cdimauro per l'aiuto! Vi farò sapere se risolvo!
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Il nuovo Qualcomm Snapdragon 8 Gen 5 stu...
Sky e Amazon trasmetteranno la Champions...
'Robot abbastanza forti da fratturare un...
Anche DAZN ha il suo Black Friday: 40 eu...
Carmageddon: Rogue Shift, il prossimo ca...
Redal Alert 2: Command & Conquer si ...
Kingston Technology: memorie e storage c...
Narwal Freo Z10 Ultra: il robot con moci...
In 3 minuti le vedete tutte: sono le mig...
Black Friday da record per Tineco: le sc...
La nuova PS5 con Fortnite manda in tilt ...
Amazon, i tagli hanno colpito soprattutt...
Pazzesco: Panasonic Lumix DC-GH5M2E a 79...
Ecco tutte le offerte Black Friday pi&ug...
DJI Neo a 169€, Flip Combo a 309€ e molt...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:30.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v