Benutzerdefinierte Implementierung der ArcGIS-Funktion

9

Ich möchte herausfinden, was zum Erstellen einer benutzerdefinierten Implementierung einer ArcGIS-Funktion erforderlich ist. Insbesondere möchte ich GeoAnalyst.ISurfaceOp2.Visibility () implementieren , damit es schneller ausgeführt wird. Derzeit dauert es ca. 3 Sekunden pro Aufruf von Visibility (). Nach meinem begrenzten Verständnis besteht der Engpass darin, temporäre Raster in das Dateisystem zu schreiben. Wenn dies im Speicher erfolgen könnte, würde sich die Verarbeitungszeit vermutlich erheblich verkürzen. Ich mache das in einem .NET-Projekt, aber Lösungen in jeder Sprache sind willkommen.

Ross Fuhrman
quelle
Warum nicht einfach die temporären Raster auf eine RAM-Disk schreiben lassen? Dann müssen Sie die Sichtbarkeit nicht von Grund auf neu codieren, was mit eigenen Risiken und Kosten verbunden ist.
whuber
Das klingt gut. Wie würde ich das machen? Ist das nicht das, was @Radar in der Antwort unten nicht sagt?
Ross Fuhrman
4
Sie installieren eine RAM-Disk auf Ihrem System. Details variieren mit dem Betriebssystem. Dann zeigen Sie mit dem ArcGIS-Arbeitsordner darauf. Sie können eine SSD fast genauso gut verwenden, insbesondere wenn Ihre Raster sehr groß sind oder wenn Sie nicht viel RAM haben.
whuber
Ich mag die RAM-Disk-Idee. Eine SSD ist riskant, da sie sich nicht für ständige Lese- / Schreibvorgänge eignet, da sie schnell abgenutzt sein kann.
Radar
2
Eine Flash-basierte SSD überlebt 1 - 5 Millionen Schreibvorgänge, @Radar, aber DRAM-SSDs werden sich überhaupt nicht "abnutzen". Besuchen Sie storagesearch.com für (viele) weitere Informationen.
whuber

Antworten:

5

Diese Antwort erinnert an einige der Diskussionen in den Kommentaren und erweitert diese. Eine RAM-Disk emuliert ein externes Disk-Laufwerk unter Verwendung eines Teils des RAM in einem Computersystem. Es kann mit Geschwindigkeiten lesen und schreiben, die mit dem In-Memory-Caching vergleichbar sind, abzüglich eines geringen Overheads für die Übersetzungsprotokolle, um festplattenorientierte Befehle in speicherorientierte Befehle umzuwandeln. Eine RAM-Disk wird durch Ausführen einer speziellen Software auf Betriebssystemebene, einem "Gerätetreiber", erstellt. Open Source- und freie RAM-Festplatten sind für viele Betriebssysteme verfügbar, einschließlich Windows.

Daher auf eine Art und Weise zu einem Engpass beschleunigen aufgrund Zwischen Disk - I / O eine RAM - Disk (Kauf des zusätzlichen RAM , falls erforderlich) und legen Sie den neu erstellten Ordner dort einzurichten ist. (Dies ist normalerweise eine Softwareeinstellung.)

Eine weitere Option ist die Installation eines High-End- DRAM-Solid-State-Geräts (SSD), bei dem es sich im Wesentlichen um einen RAM-Block in einer separaten Verpackung mit einer elektronischen Schnittstelle handelt, die wie ein Festplattenlaufwerk wirkt. Es wird anstelle eines Festplattenlaufwerks in einem Computersystem installiert und verhält sich genau wie ein anderes Festplattenlaufwerk ohne zusätzliche Software, liest und schreibt jedoch fast so schnell wie Speicherzugriffe. Diese sind relativ teuer, aber wahrscheinlich wird auch für einen sehr großen Zwischenrasterspeicher nur ein kleiner benötigt.

Bevor Sie einen dieser Schritte ausführen, ist es wichtig, ein Profil zu erstellender Prozess, um festzustellen, wo der Engpass wirklich ist. (Windows wurde in den letzten Jahren mit immer leistungsfähigeren Profiling- und Überwachungs-Apps ausgeliefert, die in Win 7 als Task-Manager / Resource-Monitor-Paar verfügbar sind, und natürlich sind viele ähnliche Apps auch für andere Betriebssysteme verfügbar.) Viele Systeme werden automatisch konfiguriert oder kann so konfiguriert werden, dass Lese- und Schreibvorgänge für kurze Zeit im RAM zwischengespeichert werden. Das Caching funktioniert fast genauso wie eine RAM-Disk, ist aber wahrscheinlich noch schneller: Die Software glaubt, dass sie Zwischendateien auf die Disk schreibt, aber das Betriebssystem schreibt sie vorübergehend zuerst in den RAM und greift nicht auf die Disk zu, in der Hoffnung, dass bald dieselben Daten vorliegen wird zurückgelesen und gelöscht. In diesem Fall ist ein physisches Schreiben niemals erforderlich.

Angesichts des Rechenaufwands, der für eine vollständige Sichtbarkeitsberechnung erforderlich ist (in einem naiven Algorithmus muss jede Zelle für jeden Blickwinkel einmal auf Sichtbarkeit überprüft werden), sollte zumindest vermutet werden, dass die Rechengeschwindigkeit und nicht die Festplatten-E / A das Problem sein kann Hier. In diesem Fall sind RAM-Festplatten oder SSDs Zeit- und Geldverschwendung. Stattdessen sollten Anstrengungen unternommen werden, um den zugrunde liegenden Algorithmus zu analysieren und zu verbessern .

In einem anderen Thread wurde diskutiert, ob die Leistung der RAM-Festplatte ArcGIS hilft .

whuber
quelle
+1 Großartige Resonanz. Ich denke, GIS-Leute sollten auch die allgemeine Verwendung der Grafikverarbeitungseinheit ( GPGPU) im Auge behalten . Ich vermute, dass die meisten Ego-Shooter- Spiele die GPU nutzen, um die Sichtbarkeit des Objekts vom Standort des Shooters aus zu bestimmen. Es wäre toll, eine OpenCL- Implementierung dieses Problems zu sehen. Wenn GIS die GPU häufiger verwendet, könnte dies die Aufmerksamkeit von Kindern auf sich ziehen, die mit Videospielen aufgewachsen sind.
Kirk Kuykendall
Ich wollte auch erwähnen, dass die GPU für die Bestimmung versteckter Oberflächen optimiert ist, ähnlich wie ISurfaceOp2.Visibility.
Kirk Kuykendall
Gute Ideen, @Kirk. Manifold verwendet die NVIDIA-GPUs (und das seit mehreren Jahren). Es gibt auch unabhängige Forschung an dieser Front; Ich war Teil einiger Zuschussvorschläge zur Entwicklung von GPU-basierten Kartenalgebra-Implementierungen.
whuber
Dies ist eine ausgezeichnete Antwort. Ich habe die vorgeschlagene Profilerstellung durchgeführt, und es schien, dass möglicherweise ein Festplatten-E / A-Engpass vorliegt. Also habe ich eine Lösung implementiert, die eine RAM-Disk verwendet (ich habe IMDisk gewählt). Dies hat letztendlich die Zeit für den Abschluss des Prozesses nicht verkürzt.
Ross Fuhrman
Es tut mir leid zu hören, dass es keine Verbesserung gab. Sichtbarkeit ist eine teure Berechnung: Im Prinzip muss jede Zelle im DEM für jeden Beobachter inspiziert werden, und der Inspektionsprozess muss möglicherweise eine ganze Reihe von Zellen zwischen dem Beobachter und der DEM-Zelle untersuchen. Dies kann Milliarden von Berechnungen pro Zelle bedeuten Beobachter auch auf einem bescheidenen (Megapixel) Raster. Wenn die Rechenzeit das Problem ist, werden Ihre beiden besten Optionen wahrscheinlich (1) die Arbeit parallelisieren: Beobachter auf Arbeitsstationen verteilen, Sichtbarkeit berechnen, Ergebnisse kombinieren; und (2) schreiben Sie Ihren eigenen Sichtbarkeitscode.
whuber
3

Leider können Sie die IRasterAnalysisEnvironment nicht so einstellen, dass sie mit einem In-Memory-Arbeitsbereich funktioniert.

Dieser Thread behebt das Problem.

Radar
quelle