我正在遍历数据集的行并将其插入到活动空间环境中(由 tibco 提供,它是一个内存数据库)。我就是这样做的。
有没有更快的方法来解决这个问题?
我正在考虑对行进行分区,然后将每个分区并行化,但我不知道这是否会使其更快。
System.Threading.Tasks.Parallel.ForEach(
dataSet.Tables[0].Rows,
currRow =>
{
var tuple = Com.Tibco.As.Space.Tuple.Create();
for (int i = 0; i < currRow.Values.Length; i++)
{
if (currRow.Values[i] != null)
{
var k = ConvertToAny(currRow.Values[i].ToString());
if (k.GetType().IsEquivalentTo(typeof(DateTime)))
{
tuple.Put(dataSet.Tables[0].ColumnNames[i], (DateTime)k);
}
else if (k.GetType().IsEquivalentTo(typeof(double)))
{
tuple.Put(dataSet.Tables[0].ColumnNames[i], (double)k);
}
else
{
tuple.Put(dataSet.Tables[0].ColumnNames[i], k.ToString());
}
}
}
try
{
inSpace_.Put(tuple);
}
catch (Exception e)
{
}
}
);
我正在考虑一次批量处理大约 1000 个,如果有人可以请帮助:(
编辑:
List tuplesToAdd = new List(); for (int i = 0; i < dataSet.Tables[0].Rows.Length; i++) { var tuple = Com.Tibco.As.Space.Tuple.Create();
for (int j = 0; j < dataSet.Tables[0].Rows[i].Values.Length; j++)
{
if (dataSet.Tables[0].Rows[i].Values[j] != null)
{
var k = ConvertToAny(dataSet.Tables[0].Rows[i].Values[j].ToString());
if (k is DateTime)
{
tuple.Put(dataSet.Tables[0].ColumnNames[j], (DateTime)k);
}
else if (k is Double)
{
tuple.Put(dataSet.Tables[0].ColumnNames[j], (Double)k);
}
else
{
tuple.Put(dataSet.Tables[0].ColumnNames[j], k.ToString());
}
}
}
tuplesToAdd.Add(tuple);
if (i % 100000 == 0 || i == dataSet.Tables[0].Rows.Length - 1)
{
ThreadStart TUPLE_WORKER = delegate
{
inSpace_.PutAll(tuplesToAdd);
};
new Thread(TUPLE_WORKER).Start();
tuplesToAdd.Clear();
}
}
这是我尝试做的新方法(通过批处理)