LINQ foreach при создании списка - PullRequest
1 голос
/ 18 февраля 2011

У меня есть простое утверждение LINQ, которое составляет огромный список из примерно 8 миллиардов предметов. Каждый из элементов затем проходит по циклу, и над элементом выполняется операция. Проблема в том, что foreach даже не запускается, пока список не будет полностью создан. Можно ли использовать LINQ и заставить его выполнять foreach для каждого элемента при его создании вместо ожидания?

Я не делаю ничего в списке, как сортировка. Просто построение списка.

Редактировать: Это может показаться странным, но у меня есть несколько строк базы данных с несколькими числовыми значениями. Я знаю, что некоторая арифметическая комбинация этих значений дает желаемое число, но я не уверен, какое именно. Таким образом я создал следующий LINQ:

(
 from I1 in Items
 from I2 in Items
 from I3 in Items
 from I4 in Items
 select new Item[] { I1, I2, I3, I4 }
).ToList().ForEach(x => CalculateValues(x);

Я сделал вышеупомянутое утверждение для 1 пункта, затем для 2 пунктов и так далее. Мой компьютер некоторое время зависал на 3 предметах с примерно 28 миллионами предметов.

Я знаю, что это неэффективно, но я собирался сделать быструю программу для запуска в одночасье.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Звучит так, как будто вы хотите использовать yield при построении списка, если это возможно, чтобы у вас не было 8 миллиардов элементов.

Например,

public IEnumerable<MyItem> ListBuilder()
{
   while (stillBuilding)
   {
       yield return currentItem;
   }
}

Затем просмотрите результат этого.

Если вы хотите что-то параллельное / многопоточное, тогда это более сложно, и вам, вероятно, нужно иметь один поток, создающий элементы и передавающий их в очередь, и один или несколько потоков-потребителей вытаскивают элементы из очереди.и выполнение операций.

1 голос
/ 18 февраля 2011

Не вызывайте ToList(), этот метод попытается загрузить все данные в память

Попробуйте это,

var q = from I1 in Items
        from I2 in Items
        from I3 in Items
        from I4 in Items
        select new Item[] { I1, I2, I3, I4 };

foreach(var x in q)
{
    CalculateValues(x);
}

это может все еще быть медленным для вашего ввода, но оно будет передавать результаты и обрабатывать их по одному, если я прав.

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