Управление адресами виртуальной памяти в c # - PullRequest
3 голосов
/ 24 ноября 2011

Я работаю над Монте-Кэролом, и мне нужно повысить эффективность двигателя.

  • Путь MonteCarlo создается сторонней библиотекой (на c ++)
  • Ценообразование выполняется в IronPython (сценарий, созданный конечным пользователем)
  • Все остальное управляется приложением c #

Процесс ценообразования следующий:

  • Приложение C # запрашивает путь и собирает их
  • Приложение C # проталкивает пути к скрипту, который оценивает и возвращает значения
  • Приложение C # отображает результат для конечного пользователя

Количество и размер собранных путей известны заранее.

У меня есть 2 решения с некоторыми преимуществами и недостатком:

  1. Запросить генерацию пути для каждого пути, попросить скрипт вернуть результат и, наконец, агрегировать результаты после обработки всех путей
  2. Запросить генерацию пути, собрать их все, попросить скрипт обработать их все сразу и вернуть мне окончательную цену

Первые решения отлично работают во всех сценариях, но по мере того, как количество запрошенных путей увеличивает производительность, я думаю, что это связано с многократным вызовом ironpython.

Второе решение более быстрое, но может вызвать исключение «недостаточно памяти» (я думаю, что недостаточно адресации виртуальной памяти), если число запрошенных путей слишком велико

Я выбираю золотую середину и обрабатываю кучу путей, затем агрегирую цены. Теперь я хочу повысить производительность, зная заранее, сколько путей я могу обработать, не выходя за исключение «нехватка памяти»

Я сделал математику, и я заранее знаю размер (в памяти) пути для данного запроса. Однако, поскольку я уверен, что это не проблема с памятью, а проблема с адресацией виртуальной памяти


Итак, весь этот текст резюмируется следующими 2 вопросами:

  1. Можно ли заранее узнать, сколько виртуальной памяти адресует моя процессу нужно будет сохранить экземпляр класса (размер в памяти и структура известны)?
  2. Можно ли узнать, сколько адресов виртуальной памяти все еще доступно для моего процесса

Кстати, я работаю на 32-битном компьютере

Заранее спасибо за помощь

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Узнать, сколько памяти занимает объект в .NET, довольно трудная задача. Я столкнулся с той же проблемой несколько раз. Есть несколько несовершенных методов, но ни один из них не очень точен.

Мое предложение состоит в том, чтобы получить некоторую оценку того, сколько займет путь, а затем пропустить кучу из них, оставляя хороший запас прочности. Даже если вы обрабатываете их всего по 10 за раз, вы уже снизили накладные расходы в 10 раз.

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

Может ли быть так, что переполнение памяти вызвано некоторыми несовершенствами процессора тракта? Утечки памяти может быть? Это возможно как в C ++, так и в .NET.

1 голос
/ 24 ноября 2011
...