Обработка массивных в памяти объектов в .NET - PullRequest
3 голосов
/ 18 июня 2009

Эй, ребята, вот проблема,

По сути, у меня есть очень большой список, содержащий в свою очередь относительно большие словари

Итак, у меня очень большая коллекция памяти.

Затем я вручную сериализовал эту коллекцию в XML и отправил ее по http. Излишне говорить, что XML слишком большой, иногда такой большой, что я получаю исключение OutOfMemory, даже не пытаясь отправить его.

В .NET, как бы я мог рассчитать потенциальное использование памяти. Например, в этом случае мне нужно разбить XML на куски, обрабатывая только небольшие объемы коллекции в время.

Как эффективно рассчитать размер каждого "чанка" на лету. Я не хочу выбирать произвольное число, например "обрабатывать 100 элементов одновременно", Я хочу приблизительно узнать, насколько большим должен быть каждый блок для каждого конкретного случая.

ура

UPDATE

Хотя @Jacob предоставил лучшее решение для этой конкретной проблемы, концептуальная структура приложения сама по себе несовершенна.

Действительно, решение состоит в том, чтобы выполнить часть вашего сообщения, чтобы вычислить, насколько большим может быть сообщение при работе с коллекцией.

Затем вы отправляете каждую единицу приемлемого размера, одну за другой.

Но это всего лишь взлом. Реальное решение - либо найти способ не передавать большие сообщения, либо использовать совершенно другой протокол.

Здесь есть интересный пост на эту тему , хотя, если вы хотите использовать SOAP, я решил найти способ отправить столько данных.

Ответы [ 4 ]

6 голосов
/ 18 июня 2009

Почему бы вам не выполнить потоковую передачу данных, чтобы просто конвертировать в XML на лету, избегая огромного файла XML в памяти?

2 голосов
/ 18 июня 2009

Я думаю, что у вас может быть концептуальная проблема больше всего на свете. «Рассчитать потенциальное использование памяти» расходится с «эффективно рассчитать размер каждого куска». Единственный способ действительно использовать вашу память с точностью, с которой вы можете предсказать адекватный размер фрагмента, - это на самом деле сделать ваше преобразование.

Похоже, что лучший способ достичь этого эффективно, возможно, состоит в том, чтобы заняться этим постепенно - по существу, то, что говорят те, кто предлагает потоковые объекты. Если вы не можете использовать реальную потоковую передачу, вы, вероятно, захотите структурировать свою сериализацию так, чтобы вы прогрессировали по одной концептуальной единице за раз (т.е. один элемент в списке с его дочерними словарями-помощниками).

1 голос
/ 18 июня 2009

Как вы отправляете это? Вы должны сделать это через WCF, который может выполнять потоковую передачу. Это также даст вам возможность с помощью конфигурации выбрать, использовать ли XML, двоичный файл или что-то еще.

0 голосов
/ 10 декабря 2009

Если это проблема отправки, разве это не проблема? Похоже, вы пытаетесь решить половину проблемы. XML - большое нет-нет для больших данных.

...