ইএসআরআই সমর্থন বলছে যে তারা বিষয়টি পুনরুত্পাদন করেছে এবং একটি বাগ রিপোর্ট (NIM070156) খুলেছে।
আমি স্থির করেছি একটি মেমরি লিক (অপরিচালিত গাদা মেমরি) যে যে ঘটে যখন একটি টুল আমার .NET / C # এর ArcMap অ্যাড-মধ্যে সঞ্চালিত একটি স্থানিক ক্যোয়ারী (একটি ফিরে ICursor
থেকে IFeatureClass.Search
একটি সঙ্গে ISpatialFilter
ক্যোয়ারী ফিল্টার)। সমস্ত COM অবজেক্টগুলি আর প্রয়োজনের সাথে সাথে ব্যবহার করা হবে না (ব্যবহার করা Marshal.FinalReleaseCOMObject
)।
এটি নির্ধারণ করার জন্য আমি প্রথমে আরক্যাপ্যাপেক্সের ব্যক্তিগত বাইটস, ভার্চুয়াল বাইটস এবং ওয়ার্কিং সেটগুলির জন্য কাউন্টারগুলির সাথে একটি পারফরমন সেশন সেট আপ করেছি এবং উল্লেখ করেছি যে এই তিনটিই ক্রমটি সম্পাদন করে এমন সরঞ্জামের প্রতিটি ব্যবহারের সাথে ধীরে ধীরে বৃদ্ধি পেয়েছে (মোটামুটি 500KB দ্বারা) । গুরুতরভাবে, এটি কেবল তখন ঘটে যখন এসডিইতে সরাসরি সংযোগ (ST_Geometry স্টোরেজ, ওরাকল 11g ক্লায়েন্ট এবং সার্ভার) ব্যবহার করে বৈশিষ্ট্য ক্লাসের বিরুদ্ধে সঞ্চালিত হয় । কোনও ফাইল জিওডাটাবেস ব্যবহার করার সাথে সাথে অ্যাপ্লিকেশন সংযোগ ব্যবহার করে এমন কোনও পুরানো এসডিই উদাহরণের সাথে সংযোগ করার সময় কাউন্টারগুলি স্থির থাকে remained
তারপরে আমি লিকডিয়াগ এবং এলডিগ্রাফার (এই ব্লগ পোস্টের কিছু গাইডেন্স সহ ) ব্যবহার করেছি এবং তিনবার উইন্ডোজ হিপ অ্যালোকেটর লগড করেছি: যখন আমি প্রথম আর্কম্যাপটি লোড করি এবং এটি আরম্ভ করার জন্য সরঞ্জামটি নির্বাচন করি, তখন সরঞ্জামটি কয়েক ডজন বার চালানোর পরে এবং চলার পরে এটি আরও কয়েক ডজন বার।
এলডিগ্রাফারের ডিফল্ট ভিউ (মোট আকার) এ প্রদর্শিত ফলাফল এখানে রয়েছে:
লাল রেখার জন্য এখানে কল স্ট্যাক রয়েছে:
আপনি যেমন SgsShapeFindRelation2
এস.জে.ডি.এল-তে ফাংশনটি দেখতে পাচ্ছেন তা মেমরি ফুটোটির জন্য দায়ী বলে মনে হয়।
আমি যেমন বুঝতে পারি যে এস.জি.ডিএল হ'ল আর্কওবজেক্টস দ্বারা ব্যবহৃত মূল জ্যামিতি গ্রন্থাগার, এবং SgsShapeFindRelation2
সম্ভবত সেখানে স্থানিক ফিল্টার প্রয়োগ করা হচ্ছে।
আমি অন্য কিছু করার আগে, আমি কেবল দেখতে চেয়েছিলাম যে অন্য কেউ এই ইস্যুতে (বা অনুরূপ কিছু) চালিত হয়েছে কিনা এবং তারা যদি এ সম্পর্কে কিছু করতে সক্ষম হয় তবে কী হবে। এছাড়াও কেবল সরাসরি সংযোগের ফলেই এর কারণ কী হতে পারে? এই শব্দটি কি আরকোবজেক্টস, একটি কনফিগারেশন সমস্যা, বা কোনও প্রোগ্রামিং সমস্যার মতো বাগের মতো?
এই আচরণটি উত্পাদন করে এমন পদ্ধতির নূন্যতম সংস্করণ এখানে রয়েছে:
private string GetValueAtPoint(IPoint pPoint, IFeatureClass pFeatureClass, string pFieldName)
{
string results = "";
ISpatialFilter pSpatialFilter = null;
ICursor pCursor = null;
IRow pRow = null;
try
{
pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pPoint;
pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
pSpatialFilter.SearchOrder = esriSearchOrder.esriSearchOrderSpatial;
pCursor = (ICursor)pFeatureClass.Search(pSpatialFilter, false);
pRow = pCursor.NextRow();
if (pRow != null)
results = pRow.get_Value(pFeatureClass.FindField(pFieldName)).ToString();
}
finally
{
// Explicitly release COM objects
if (pRow != null)
Marshal.FinalReleaseComObject(pRow);
if (pCursor != null)
Marshal.FinalReleaseComObject(pCursor);
if (pSpatialFilter != null)
Marshal.FinalReleaseComObject(pSpatialFilter);
}
return results;
}
এখানে রাগির সাথে নীচের আলোচনার ভিত্তিতে আমার কাজের কোডটি দেওয়া হল:
private bool PointIntersectsFeature(IPoint pPoint, IFeature pFeature)
{
bool returnVal = false;
ITopologicalOperator pTopoOp = null;
IGeometry pGeom = null;
try
{
pTopoOp = ((IClone)pPoint).Clone() as ITopologicalOperator;
if (pTopoOp != null)
{
pGeom = pTopoOp.Intersect(pFeature.Shape, esriGeometryDimension.esriGeometry0Dimension);
if (pGeom != null && !(pGeom.IsEmpty))
returnVal = true;
}
}
finally
{
// Explicitly release COM objects
if (pGeom != null)
Marshal.FinalReleaseComObject(pGeom);
if (pTopoOp != null)
Marshal.FinalReleaseComObject(pTopoOp);
}
return returnVal;
}
private string GetValueAtPoint(IPoint pPoint, IFeatureClass pFeatureClass, string pFieldName)
{
string results = "";
ISpatialFilter pSpatialFilter = null;
IFeatureCursor pFeatureCursor = null;
IFeature pFeature = null;
try
{
pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pPoint;
pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
pFeatureCursor = pFeatureClass.Search(pSpatialFilter, true);
pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
if (PointIntersectsFeature(pPoint, pFeature))
{
results = pFeature.get_Value(pFeatureClass.FindField(pFieldName)).ToString();
break;
}
pFeature = pFeatureCursor.NextFeature();
}
}
finally
{
// Explicitly release COM objects
if (pFeature != null)
Marshal.FinalReleaseComObject(pFeature);
if (pFeatureCursor != null)
Marshal.FinalReleaseComObject(pFeatureCursor);
if (pSpatialFilter != null)
Marshal.FinalReleaseComObject(pSpatialFilter);
}
return results;
}