Caricare nell'elenco in un ciclo e quindi elaborare l'elenco in un altro o eseguire tutto in una volta

1

Ho un set di dati pieno di righe che devo inizializzare in myclass e quindi elaborare.

Attualmente eseguo il looping di ogni riga nel set di dati, inizializzando una nuova istanza di myclass , quindi aggiungendo quell'istanza a un elenco con tipo myclass .

Quindi faccio un ciclo attraverso l'elenco e conduco un processo su ogni istanza (per lo scopo dell'esempio, diciamo che devo inviare ogni istanza come messaggio SOAP).

La mia domanda è: mantengo la struttura così com'è (con un elenco di% istanze dimyclass) o butto l'elenco e processerò la mia istanza (cioè invii il messaggio SOAP) all'interno dello stesso ciclo che inizializzo il oggetto? Praticamente baserei un nuovo metodo in myclass per inviare questo messaggio SOAP.

Mi interessano le prestazioni e l'utilizzo della memoria. È un processo batch in cui devo elaborare 20,0000 righe alla volta. Ho risorse limitate sul server host.

Informazioni aggiuntive: Se un errore di inizializzazione o una trasmissione SOAP falliscono, voglio continuare con l'elaborazione di ogni riga ...

    
posta S1r-Lanzelot 15.02.2016 - 17:56
fonte

2 risposte

6

Se usi un linguaggio moderno come Python, C # o Java, perché non utilizzare gli iteratori? Scrivi una funzione che produce gli oggetti e restituisce un iteratore valutato pigro (in C # un IEnumerable<myclass> , in Java Iterable<myclass> ), e un altro che itera sopra il risultato della prima funzione e esegue l'elaborazione per ciascun oggetto.

In questo modo, puoi separare le preoccupazioni relative alla costruzione e all'elaborazione dell'oggetto senza produrre una lista intermedia di oggetti in memoria. Inoltre, non investirò troppe riflessioni in alcuna ipotetica penalizzazione delle prestazioni di questo approccio quando uno dei passaggi di elaborazione è "per inviare un'istanza come messaggio SOAP sulla rete"

Riguardo agli errori di inizializzazione o di elaborazione: questo è completamente ortogonale rispetto ai progetti discussi. Puoi gestirlo in un grande ciclo, con una lista intermedia o con un iteratore, questo non fa una grande differenza.

    
risposta data 15.02.2016 - 18:30
fonte
2

Penso che la differenza di prestazioni sarebbe trascurabile. È solo una questione di preferenza. Il collo di bottiglia sarebbe probabilmente la rete comunque.

Se vuoi davvero essere "economico", evita di costruire un enorme elenco di oggetti. Basta scorrere i tuoi dati di origine e riutilizzare un'istanza dell'oggetto, o un pool di essi se multi-thread.

    
risposta data 15.02.2016 - 18:31
fonte

Leggi altre domande sui tag