Daha çox

IWorkspaceEdit ilə ArcObjects Yaddaş Sızıntısı?


ArcGIS 10.1 quraşdırmışam. IFeatureBuffer -dən istifadə edərək bütün xüsusiyyətləri bir şəkildən digərinə kopyalamaq üçün bir funksiya yaratdım, indi hər dəfə çağırıldıqda bir az yaddaş tutur, amma bu qədər buraxmır, yəni hər bir funksiyada yaddaş sızması deyilir olur. Gördüyüm şey, yaddaş sızıntısının şəkil faylının ölçüsündən asılı olmasıdır, təxminən 34000 xüsusiyyətə malik olan şəkil faylını idxal etmişəm və yaddaş sızması daha kiçik bir şəkil faylından daha böyükdür. Bu davranışın minimum kod versiyası budur:

ictimai boşluq CopyFeatures (string srcFile, string srcDir, string outFile, string outDir) {IWorkspaceFactory workspaceFactory = yeni ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory (); IWorkspace iş sahəsi = workspaceFactory.OpenFromFile (srcDir, 0); IFeatureClass featureClass = ((IFeatureWorkspace) iş sahəsi) .OpenFeatureClass (srcFile); IFeatureCursor featureCursor = featureClass.Search (null, false); IFeature xüsusiyyət = 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 kimi IWorkspaceEdit; if (! workspaceEdit.IsBeingEdited ()) {workspaceEdit.StartEditing (yalan); workspaceEdit.StartEditOperation (); } IFeatureBuffer outputFeatureBuffer = outputFeatureClass.CreateFeatureBuffer (); IFeatureCursor outputFeatureCursor = outputFeatureClass.Insert (doğru); while (xüsusiyyət! = null) {for (int i = 0; i  0); }}

İndi hər dəfə CopyFeatures funksiyası çağırıldıqda, bəzi yaddaş boşalmır və istifadə olunan yaddaş artmağa davam edir. Beləliklə, hər hansı bir təklif, bu yaddaş sızıntısı problemini necə həll edə bilərəm? İnternetdə çox axtardım, amma uyğun bir həll tapa bilmədim, çalışdığım hər bir həll işləmədi və hələ də bəzi yaddaş buraxılmadı.

Həm də kopya xüsusiyyətləri vasitəsi ilə yoxladım və yaddaş problemi baş vermədi, ancaq yuxarıdakı kod orijinal kodumdan bir alıntıdır, istifadə edə bilmədiyim hər bir xüsusiyyətdə bəzi məntiq və bəzi yoxlamalar aparmalıyam. bu ssenaridə kopiya xüsusiyyətləri.


Xüsusiyyətlər daxil edildikdən sonra iş sahəsinin redaktə sessiyasına başlayaraq və dayandıraraq bu problemi həll edə bildim. Yuxarıda göstərilən vəziyyətdə, heç bir yaddaş sızıntısı olmayacaq istənilən kopya xüsusiyyətləri funksiyası olacaq.

public void CopyFeatures (string srcFile, string srcDir, string outFile, string outDir) {IWorkspaceFactory workspaceFactory = yeni ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory (); IWorkspace iş sahəsi = workspaceFactory.OpenFromFile (srcDir, 0); IFeatureClass featureClass = ((IFeatureWorkspace) iş sahəsi) .OpenFeatureClass (srcFile); IFeatureCursor featureCursor = featureClass.Search (null, false); IFeature xüsusiyyət = 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 (doğru); while (xüsusiyyət! = null) {for (int i = 0; i 

IWorkspaceEdit interfeysi yalnız geodatabase ilə işləyərkən istifadə olunur. Davanız şəkillidir - Başa salma metodlarının istifadəsi yaddaş bəyənmə problemini həll etməyə niyə kömək etdiyini başa düşmürəm.


Videoya baxın: ArcGIS - Converting a geodatabase to shapefiles (Sentyabr 2021).