Многопоточный доступ к MapPoint?

Добрый день,

Как я уже говорил ранее в другом посте, мне нужно вычислить около 8 000 000 кратчайших расстояний / расстояний между точками на карте, координаты которых известны. Проблема в том, что, хотя прямолинейные расстояния было легко (и быстро) рассчитать, кто-то сказал мне, что однопоточное приложение может иметь проблемы при расчете этого количества расстояний с помощью MapPoint. Вопрос в том, что я ничего не знаю о многопоточности... В настоящее время я работаю в среде i7 - 720QM, поэтому я хотел бы использовать все 4 ядра для этих вычислений... Есть ли простой способ сделать это в C# или C++?

Большое спасибо.

2 ответа

Если вы новичок в многопоточности, то мой совет начните с компонента BackGroundWorker в качестве отправной точки и постепенно переключайтесь на более тонкие концепции потоков.

и если вы используете..net 4.0, то Task Parallel Library дает вам простой способ начать.

Смотрите ссылки ниже

TPL

BackgroundWorker

Возможно, это я сказал, что это займет много времени. COM API MapPoint является однопоточным. Чтобы заставить его вычислять несколько маршрутов параллельно, нужно запустить несколько MapPoint, каждый в своем собственном потоке.

Итак, для вашего четырехъядерного ядра вы запустите 2-3 потока. Каждый поток запускает свою собственную MapPoint, а затем использует ее для маршрутизации. У вас не будет одного MapPoint на ядро. Кроме того, накладные расходы ОС и ваши затраты ввода / вывода, если вы посмотрите, как один MapPoint вычисляет маршрут, вы обнаружите, что более поздние версии частично внутренне многопоточные и могут занять около 1,5 ядер, если они доступны.

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

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

Совет Саураба для.NET 4 звучит неплохо: мне еще предстоит использовать многопоточность.NET 4 в гневе - мой опыт работы с потоками MapPoint/.NET связан с.NET 2.

Я не знаю, какое у вас приложение, но знаете ли вы, что я продаю продукт, который использует многопроцессорный MapPoint для расчета расстояния / времени в пакетном маршруте...:-)

Другие вопросы по тегам