В проекте мне нужно вызывать внешний API в зависимости от времени.Таким образом, в течение одного дня мне может понадобиться вызвать API 24 раза, один вызов - один час.Результатом API является файл XML, который имеет 6 полей.Мне нужно будет вставить эти данные в таблицу.В среднем за каждый час в нем содержится около 20 000 строк данных.
Таблица имеет следующие 6 столбцов:
col1, col2, col3, col4, col5, col6
Когда все 6 столбцов совпадают, мы считаем, что строки одинаковы, и мы не должны вставлять дубликаты.
Я использую C # и Entity Framework для этого:
foreach (XmlNode node in nodes)
{
try
{
count++;
CallData data = new CallData();
...
// get all data and set in 'data'
// check whether in database already
var q = ctx.CallDatas.Where(x => x.col1 == data.col1
&& x.col2 == data.col2
&& x.col3 == data.col3
&& x.col4 == data.col4
&& x.col5 == data.col5
&& x.col6 == data.col6
).Any();
if (q)
{
// exists in database, skip
// log info
}
else
{
string key = $"{data.col1}|{data.col2}|{data.col3}|{data.col4}|{data.col5}|{data.col6}";
// check whether in current chunk already
if (dic.ContainsKey(key))
{
// in current chunk, skip
// log info
}
else
{
// insert
ctx.CallDatas.Add(data);
// update dic
dic.Add(key, true);
}
}
}
catch (Exception ex)
{
// log error
}
}
Logger.InfoFormat("Saving changes ...");
if (ctx.ChangeTracker.HasChanges())
{
await ctx.SaveChangesAsync();
}
Logger.InfoFormat("Saving changes ... Done.");
Код работает нормально.Однако нам нужно будет использовать этот код для запуска в течение последних нескольких месяцев.Проблема в том, что код работает медленно, поскольку для каждой строки необходимо проверить, существует ли он уже.
Есть ли какие-либо предложения по повышению производительности?
Спасибо