Разделение списка на куски - C # - PullRequest
1 голос
/ 23 апреля 2019

У меня есть список, состоящий из около 1 000 000 записей. И я использую EF, чтобы вставить его в базу данных. Поскольку это занимает слишком много времени, мне нужно разбить этот список на блоки по 100 записей и сохранить.

Как я могу это сделать?

        await dbCont.People.AddAsync(peoples);
        await dbCont.Savechanges();

Список народов здесь содержит 1 000 000 записей. И вместо того, чтобы сохранять все сразу (замедляет вставку), мне нужно вставлять около 100 записей одновременно. Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

Вы можете использовать метод расширения Пакет библиотеки MoreLinq : Пакетирует исходную последовательность в сегменты размера.

var list = new List<int>(Enumerable.Range(1, 25));
var buckets = list.Batch(size: 10);
foreach (var bucket in buckets)
{
    Console.WriteLine(String.Join(", ", bucket));
}

выход

1, 2, 3, 4, 5, 6, 7, 8, 9, 10
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
21, 22, 23, 24, 25
0 голосов
/ 23 апреля 2019

В прошлом я пытался вставить фрагменты в EF, но это медленно из-за отслеживания сущности.Конечно, вы можете отключить отслеживание объектов, но лучше использовать SqlBulkCopy для массовой вставки.Вот хорошая статья Массовая вставка данных в SQL Server .

0 голосов
/ 23 апреля 2019

Вы можете сделать это следующим образом:

var batchSize = 100;
var processed = 0;
var hasNextBatch = true;

while(hasNextBatch) 
{
    var batch = peoples.Skip(processed).Take(batch).ToList();
    await dbCont.People.AddAsync(batch);
    await dbCont.Savechanges();
    processed += batch.count;
    hasNextBatch = batch.Count == batchSize;
}

, но вы должны учитывать, что при сбое пакетной вставки предыдущие партии уже зафиксированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...