Повышение производительности при сортировке и чтении JSON из файла C # - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть JSON-файл, содержащий около 20 тыс. Строк кода, который необходимо прочитать, отсортировать и сохранить в базе данных.Я написал код для него, и он работает так, как и должно быть, но моя проблема в том, что это занимает около 10 минут.Поэтому мне интересно, есть ли у кого-нибудь идеи, что можно сделать для повышения производительности?

Json:

{
    "Number": 123456,
    "Area": "NE01"
},
{
    "Number": 123457,
    "Area": "NE01"
},

и так далее ...

C #:

dynamic json = JsonConvert.DeserializeObject(File.ReadAllText(path, Encoding.UTF8));

foreach (var obj in json)
{
    if (obj.Area == "NE01")
    {
        var o = new object
        {
            Number = obj.Number,
        };
        db.Entity.Add(obj);
        continue;
    }

    if (obj.Area == "NE02")
    {
        var o = new object
        {
            Number = obj.Number,
        };
        db.Entity.Add(obj);
        continue;
    }

    if (obj.Area == "NE03")
    {
        var o= new object
        {
            Number = obj.Number,
        };
        db.Entity.Add(obj);
        continue;
    }

    if ( obj.Area== "NE04")
    {
        var o = new object
        {
            Number = obj.Number
        };
        db.Entity.Add(obj);
        continue;
    }
}

db.SaveChanges();

Чтобы было понятнее, область имеет четыре различных значения.В зависимости от значения число будет иметь внешний ключ, который указывает на область.К сожалению, мне не разрешено ничего менять в основной базе данных.Дайте мне знать, если я должен предоставить дополнительную информацию.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Только с помощью AddRange я смог сократить время до чуть более одной минуты.Что достаточно для моей цели.

0 голосов
/ 14 февраля 2019

Используя EntityFramework.Utilities , вы можете использовать групповую вставку, которая должна ускорить вставку.

Что-то вроде:

public class Data
{
  public int Number { get; set; }
  public string Area { get; set; }
}

var objects = JsonConvert.DeserializeObject<List<Data>>(File.ReadAllText(path, Encoding.UTF8))
  .Select(d => new object { Number = d.Number })
  .ToList();

EFBatchOperation.For(db, db.Entity).InsertAll(objects);

Отказ от ответственности: Код не проверен.

...