Hello Sean,
I`ve tested my above script again and logged out time with stopwatch. For a single task with 11305 rows these are my times:
2017-08-14 10:25:30,622 [Main CIM thread] INFO - Start Write Package to FGDB: 0 seconds
2017-08-14 10:25:31,196 [Main CIM thread] INFO - Package Size: 11305 0,575 seconds
2017-08-14 10:25:31,259 [Main CIM thread] INFO - Start writing loop: 0,639 seconds
2017-08-14 10:25:31,260 [Main CIM thread] INFO - Before point transformation: 0,639 seconds
2017-08-14 10:25:31,268 [Main CIM thread] INFO - Before point transformation: 0,648 seconds
2017-08-14 10:25:31,273 [Main CIM thread] INFO - After rowbuffer filled: 0,652 seconds
2017-08-14 10:25:31,314 [Main CIM thread] INFO - After create row: 0,693 seconds
2017-08-14 10:25:31,316 [Main CIM thread] INFO - After invalidate row: 0,695 seconds
2017-08-14 10:25:57,724 [Main CIM thread] INFO - After loop: 27,102 seconds
2017-08-14 10:25:57,725 [Main CIM thread] INFO - Release rowbuffer: 27,102 seconds
2017-08-14 10:25:57,725 [Main CIM thread] INFO - Release rowbuffer end: 27,102 seconds
2017-08-14 10:25:57,725 [Main CIM thread] INFO - Release feature: 27,102 seconds
2017-08-14 10:25:57,725 [Main CIM thread] INFO - Release feature end: 27,102 seconds
Or to add the times to the logged code lines:
public Task<int> WriteDataIntoFeatureClass(string name, int index, Component selectedComponent, Config config, FeatureClassFieldInfo[] fieldInfos)
{
return QueuedTask.Run(() =>
{
_stopWatch.Start();
_logger.Info("Start Write Package to FGDB: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0 s
SpatialReference dhdn3_zone3 = SpatialReferenceBuilder.CreateSpatialReference(31467);
SpatialReference wgs84 = SpatialReferences.WGS84;
ProjectionTransformation customTransformation = ArcGIS.Core.Geometry.ProjectionTransformation.Create(wgs84, dhdn3_zone3);
// Only write to feature class if it's empty
if (selectedComponent.Measures.Count() != 0)
{
EditOperation editoperation = new EditOperation();
string message;
int packageSize = Convert.ToInt16(Math.Floor(Convert.ToDouble(selectedComponent.Measures.Count() / 7)));
_logger.Info("Package Size: " + packageSize.ToString() + " " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.575 s
using (Geodatabase geodatabase = new Geodatabase(config.FGDB.Path))
{
double progressStep = Convert.ToDouble(80) / Convert.ToDouble(selectedComponent.Measures.Count());
using (ArcGIS.Core.Data.FeatureClass featureClass = geodatabase.OpenDataset<ArcGIS.Core.Data.FeatureClass>(name + "_" + selectedComponent.Kid.ToString()))
using (SpatialReferenceBuilder srbuilder = new SpatialReferenceBuilder(4326))
using (var rowbuffer = featureClass.CreateRowBuffer())
using (FeatureClassDefinition fcDefinition = featureClass.GetDefinition())
{
editoperation.Callback(context =>
{
Feature feature = null;
try
{
_logger.Info("Start writing loop: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.639s
for (var m = (index - 1) * packageSize; m < (index * packageSize) - 1; m++)
{
if (selectedComponent.Measures.Long != null && selectedComponent.Measures.Lat != null) // do not add measures without valid coords
{
if (m == (index - 1) * packageSize)
_logger.Info("Before point transformation: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.639 s
MapPoint point = MapPointBuilder.CreateMapPoint(Convert.ToDouble(selectedComponent.Measures.Long),
Convert.ToDouble(selectedComponent.Measures.Lat));
MapPoint pointDhdn = GeometryEngine.ProjectEx(point, customTransformation) as MapPoint;
if (m == (index - 1) * packageSize)
_logger.Info("Before point transformation: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.648s
rowbuffer[fcDefinition.GetShapeField()] = point;
rowbuffer[fieldInfos[0].Name] = selectedComponent.Measures.Id;
rowbuffer[fieldInfos[1].Name] = selectedComponent.Measures.Wert;
rowbuffer[fieldInfos[2].Name] = selectedComponent.Measures.Zeit;
rowbuffer[fieldInfos[3].Name] = selectedComponent.Measures.Status;
rowbuffer[fieldInfos[4].Name] = pointDhdn.X;
rowbuffer[fieldInfos[5].Name] = pointDhdn.Y;
if (m == (index - 1) * packageSize)
_logger.Info("After rowbuffer filled: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.652s
feature = featureClass.CreateRow(rowbuffer);
if (m == (index - 1) * packageSize)
_logger.Info("After create row: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.693s
context.Invalidate(feature);
if (m == (index - 1) * packageSize)
_logger.Info("After invalidate row: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 0.695s
}
var status = Convert.ToInt32((1 + m) * progressStep);
}
_logger.Info("After loop: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 27.102s
}
catch (GeodatabaseException exObj)
{
_logger.Error(exObj.Message + " " + exObj.InnerException);
}
finally
{
if (rowbuffer != null)
{
_logger.Info("Release rowbuffer: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 27.102 s
rowbuffer.Dispose();
_logger.Info("Release rowbuffer end: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 27.102s
}
if (feature != null)
{
_logger.Info("Release feature: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 27.102s
feature.Dispose();
_logger.Info("Release feature end: " + _stopWatch.ElapsedMilliseconds / 1000f + " seconds"); 27.102s
}
}
}, featureClass);
var task = editoperation.ExecuteAsync();
var creationResult = task.Result;
if (!creationResult)
message = editoperation.ErrorMessage;
}
}
}
return 20 + (index * 10);
});
}
You see one row costs 0.056s which sums in 27 s for 11305 features. The major cost is generated in line:
feature = featureClass.CreateRow(rowbuffer);
with alone 0.041s for one row
Do you have any suggestions?