Domanda

ciao ragazzi, ecco il problema

In sostanza, ho un elenco molto ampio contenente a sua volta dizionari relativamente grandi

Quindi, fondamentalmente, ho una collezione di memorie molto grande.

Quindi serializzo manualmente questa raccolta in XML e la invio tramite http. inutile dirlo, l'XML è troppo grande, a volte così grande che ottengo un'eccezione OutOfMemory prima ancora di provare a inviarlo.

In .NET, come potrei fare per calcolare il potenziale utilizzo della memoria. Ad esempio, in questo caso, devo suddividere l'XML in blocchi, elaborando solo piccole quantità della raccolta in una volta.

Come posso calcolare in modo efficiente la dimensione di ciascun "pezzo"? al volo. Non voglio scegliere un numero arbitrario come, " elaborare 100 articoli contemporaneamente " ;, Voglio sapere, approssimativamente, quanto deve essere grande ogni blocco caso per caso.

applausi

Aggiorna

Sebbene @Jacob abbia fornito la migliore soluzione per questo particolare problema, la struttura concettuale dell'app è di per sé imperfetta.

In effetti, la soluzione è eseguire una frazione del tuo messaggio, al fine di calcolare quanto potenzialmente sarà grande il messaggio, quando lavorerai con una raccolta.

Invia quindi ciascuna unità di dimensioni accettabili, una per una.

Ma questo è solo un trucco. La vera soluzione è trovare un modo per non trasmettere messaggi di grandi dimensioni o utilizzare un protocollo completamente diverso.

C'è un post interessante sull'argomento qui sebbene se vuoi usare SOAP, tuttavia ho deciso di trovare un modo per evitare di inviare così tanti dati.

È stato utile?

Soluzione

Penso che potresti avere un problema concettuale più di ogni altra cosa. " Calcola il potenziale utilizzo della memoria " è in contrasto con "calcola in modo efficiente la dimensione di ciascun blocco". L'unico modo per realmente sfruttare il tuo utilizzo della memoria con il grado di precisione in cui puoi prevedere dimensioni del pezzo adeguate è effettivamente effettuare la conversione.

Sembra che il modo migliore per arrivare a questo in modo efficiente potrebbe essere quello di affrontarlo progressivamente, essenzialmente quello che stanno dicendo quelli che stanno suggerendo oggetti in streaming. Se non riesci a sfruttare lo streaming effettivo, probabilmente vorrai strutturare la serializzazione in modo da far progredire un'unità concettuale alla volta (ovvero un elemento nell'elenco con i relativi figli del dizionario).

Altri suggerimenti

Perché non esegui semplicemente lo streaming dei dati in modo da convertirti in XML al volo evitando di avere un enorme file XML in memoria?

Come lo stai inviando? Dovresti farlo tramite WCF, che può fare streaming. Ti darebbe anche una scelta, attraverso la configurazione, se usare XML o binario, o altro.

Se è un problema inviare, non è anche un problema ricevere? Sembra che tu stia cercando di risolvere mezzo problema. XML è un grande no-no per dati di grandi dimensioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top