下午好,
正如我之前在另一篇文章中所说,我必须计算地图中某些点之间的大约 8,000,000 个最短时间/路径距离,这些点的坐标是已知的。问题是,虽然直线距离很容易(而且很快)计算出来,但有人告诉我,单线程应用程序在使用 MapPoint 计算这个距离数时可能会遇到问题。问题是我对多线程一无所知...我目前正在使用 i7 - 720QM 环境,所以我想使用所有 4 个内核来进行这些计算...有什么简单的方法可以做到这一点在 C# 或 C++ 中?
非常感谢。
下午好,
正如我之前在另一篇文章中所说,我必须计算地图中某些点之间的大约 8,000,000 个最短时间/路径距离,这些点的坐标是已知的。问题是,虽然直线距离很容易(而且很快)计算出来,但有人告诉我,单线程应用程序在使用 MapPoint 计算这个距离数时可能会遇到问题。问题是我对多线程一无所知...我目前正在使用 i7 - 720QM 环境,所以我想使用所有 4 个内核来进行这些计算...有什么简单的方法可以做到这一点在 C# 或 C++ 中?
非常感谢。
那可能是我说这需要很长时间。MapPoint 的 COM API 是单线程的。让它并行计算多条路线的方法是启动多个 MapPoint,每个 MapPoint 都在自己的线程上。
因此,对于您的四核,您将启动 2-3 个线程。每个线程启动自己的 MapPoint,然后将其用于路由。每个核心不会有一个 MapPoint。除了操作系统开销和 I/O 开销之外,如果您观察单个 MapPoint 计算路线,您会发现更高版本的部分内部是多线程的,如果可用,可能需要大约 1.5 个内核。
还有很多需要注意的问题。MapPoint 自己的垃圾收集没有针对批量路由计算进行优化。最简单的解决方法是定期重新启动每个 MapPoint 应用程序(至少每天一次,但可能更频繁)。
此外,某些操作(文件打开似乎是主要操作)不能由多个 MapPoints 一次调用。可能是因为他们试图打开同一个文件,但我没有进一步调查。您将需要实现自己的锁定机制来避免这种情况。
Saurabh 对 .NET 4 的建议听起来不错:我还没有在愤怒中使用 .NET 4 的多线程——我的 MapPoint/.NET 线程经验是使用 .NET 2。
我不知道您的应用程序是什么,但您知道我销售的产品使用多处理器 MapPoint 进行批量路线距离/时间计算... :-)