Viac

Únik pamäte ArcObjects pomocou IWorkspaceEdit?

Únik pamäte ArcObjects pomocou IWorkspaceEdit?


Mám nainštalovaný ArcGIS 10.1. Vytvoril som funkciu na kopírovanie všetkých funkcií z jedného súboru tvarov do druhého pomocou IFeatureBuffer, teraz zakaždým, keď sa funkcia, keď sa volá, zaberá nejakú pamäť, ale neuvoľňuje toľko, čo znamená pri každom volaní funkcie únik pamäte stane sa. Zistil som, že únik pamäte závisí od veľkosti súboru tvaru. Importoval som súbor tvaru s približne 34 000 funkciami a únik pamäte bol oveľa väčší ako únik pamäte s menším súborom tvarov. Nasleduje minimálna verzia kódu tohto správania:

public void CopyFeatures (string srcFile, string srcDir, string outFile, string outDir) {IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory (); IWorkspace workspace = workspaceFactory.OpenFromFile (srcDir, 0); IFeatureClass featureClass = ((IFeatureWorkspace) pracovný priestor) .OpenFeatureClass (srcFile); IFeatureCursor featureCursor = featureClass.Search (null, false); IFeature feature = featureCursor.NextFeature (); IWorkspace outputWorkspace = workspaceFactory.OpenFromFile (outDir, 0); IFeatureClass outputFeatureClass = ((IFeatureWorkspace) outputWorkspace) .CreateFeatureClass (outFile, featureClass.Fields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IWorkspaceEdit workspaceEdit = (((IDataset) outputFeatureClass) .Workspace ako IWorkspaceEdit; if (! workspaceEdit.IsBeingEdited ()) {workspaceEdit.StartEditing (false); workspaceEdit.StartEditOperation (); } IFeatureBuffer outputFeatureBuffer = outputFeatureClass.CreateFeatureBuffer (); IFeatureCursor outputFeatureCursor = outputFeatureClass.Insert (true); while (feature! = null) {for (int i = 0; i  0); }}

Teraz, keď sa zavolá funkcia CopyFeatures, časť pamäte sa neuvoľní a použitá pamäť sa stále zvyšuje. Takže nejaký návrh, ako môžem vyriešiť tento problém s únikom pamäte? Veľa som hľadal na internete, ale nenašiel som životaschopné riešenie, každé riešenie, ktoré som vyskúšal, nefungovalo a stále sa neuvoľňovala pamäť.

Tiež som skontroloval nástroj copyfeatures a nevyskytol sa problém s pamäťou, ale vyššie uvedený kód je len výňatkom z môjho pôvodného kódu. Tiež musím vykonať každú logiku a niektoré kontroly každej funkcie, kvôli ktorej nemôžem použiť vlastnosti kopírovania v tomto scenári.


Tento problém sa mi podarilo vyriešiť spustením a zastavením relácie úprav pracovného priestoru po vložení funkcií. Vo vyššie uvedenom prípade bude nasledovať požadovaná funkcia kopírovania, ktorá nebude mať žiadny únik pamäte.

public void CopyFeatures (string srcFile, string srcDir, string outFile, string outDir) {IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory (); IWorkspace workspace = workspaceFactory.OpenFromFile (srcDir, 0); IFeatureClass featureClass = ((IFeatureWorkspace) pracovný priestor) .OpenFeatureClass (srcFile); IFeatureCursor featureCursor = featureClass.Search (null, false); IFeature feature = featureCursor.NextFeature (); IWorkspace outputWorkspace = workspaceFactory.OpenFromFile (outDir, 0); IFeatureClass outputFeatureClass = ((IFeatureWorkspace) outputWorkspace) .CreateFeatureClass (outFile, featureClass.Fields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IFeatureBuffer outputFeatureBuffer = outputFeatureClass.CreateFeatureBuffer (); IFeatureCursor outputFeatureCursor = outputFeatureClass.Insert (true); while (feature! = null) {for (int i = 0; i 

Rozhranie IWorkspaceEdit sa používa iba pri práci s geodatabázou. Váš prípad je shapefile - nerozumiem, prečo používanie metód Start_stop editácia pomáha vyriešiť problém s obľubou pamäte.


Pozri si video: Demo - Just Funny with ArcObjects SDK