понедельник, 30 ноября 2009 г.

Fast clean SPItems

Задача: быстро очистить список от большого количества элементов.

Решение: Будем использовать пакетное удаление элементов из списка.

private static void ClearList(SPList list)

{

string xmlCaml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>";

string itemNode = @"<Method><SetList Scope=""Request"">" + list.ID +

"</SetList><SetVar Name=\"ID\">{0}</SetVar><SetVar Name=\"Cmd\">Delete</SetVar></Method>";

foreach (SPListItem item in list.Items)

xmlCaml +=

string.Format(itemNode, item.ID.ToString());

xmlCaml +=

"</Batch>";

list.ParentWeb.ProcessBatchData(xmlCaml);

}

Разница между этим методом и последовательным удалением элементов огромная и скорость при увеличении количества элементов падает по линейному закону. Так что крайне рекомендую для очистки списка использовать именно этот код.

3 комментария:

DkmS комментирует...

Это же какого размера получится строка запроса для списка действительно приличного размера?

Vladimir Korotenko комментирует...

Довольно легко посчитать.
11 мегабайт на 100 000 элементов.

Однако этот метод самый простой и быстрый.

Другое что я использовал, это сохранение списка как шаблона и развертывание его снова. Удаление по одному элементу меня не впечатлило, на обьеме в 40 000 элементов я просто устал ждать, время было больше 30 минут :(

DkmS комментирует...

А других-то методов и не видно (после развёртывания из шаблона это будет другой список, чего иногда не требуется...). Вот здесь нашлась версия, которая формирует запрос и удаляет кусками, чтоб сильно много памяти не отъедать.
У меня получилось 100 элементов/сек. А по одному - тоска, конечно...