Я несколько дней искал достоверную информацию о возможности ускорения запросов LINQ с помощью графического процессора.
Технологии, которые я «исследовал» до сих пор:
- Акселератор Майкрософт
- Кудафи
- Брахма
Короче говоря, возможно ли вообще выполнять фильтрацию объектов в памяти на графическом процессоре?
Допустим, у нас есть список некоторых объектов, и мы хотим отфильтровать что-то вроде:
var result = myList.Where(x => x.SomeProperty == SomeValue);
Любые указатели на этот?
Заранее спасибо!
ОБНОВЛЕНИЕ
Я постараюсь быть более конкретным в отношении того, чего я пытаюсь достичь :)
Цель состоит в том, чтобы использовать любую технологию, способную отфильтровать список объектов (от ~ 50 000 до ~ 2 000 000) максимально быстрым способом.
Операции, которые я выполняю с данными при фильтрации (сумма, минимум, максимум и т. д.), выполняются с использованием встроенных методов LINQ и уже достаточно быстры для нашего приложения, так что это не проблема.
Узким местом является «просто» фильтрация данных.
ОБНОВЛЕНИЕ
Просто хотел добавить, что я протестировал около 15 баз данных, включая MySQL (проверка возможного кластерного подхода / решения memcached), H2, HSQLDB, VelocityDB (в настоящее время исследуется), SQLite, MongoDB и т. д., и NONE достаточно хорош, когда дело доходит до скорость фильтрации данных (конечно, решения NO-sql не предлагают этого, как решения sql, но вы поняли идею) и/или возврата фактических данных.
Просто подытожу, что мне/нам нужно:
База данных, способная сортировать данные в формате 200 столбцов и около 250 000 строк менее чем за 100 мс.
В настоящее время у меня есть решение с распараллеленным LINQ, которое способно (на определенной машине) тратить всего нано-секунды на каждую строку при фильтрации И обработки результата!
Итак, нам нужна менее нано-секундная фильтрация в каждой строке.
- Почему кажется, что это может обеспечить только LINQ в памяти?
- Почему это невозможно?
Некоторые цифры из лог-файла:
Total tid för 1164 frågor: 2579
Это шведский и переводится:
Total time for 1164 queries: 2579
Где запросы в этом случае являются такими запросами, как:
WHERE SomeProperty = SomeValue
И все эти запросы выполняются параллельно на 225639 строк.
Итак, 225639 строк фильтруются в памяти 1164 раза примерно за 2,5 секунды.
Это 9,5185952917007032597107300413827e-9 секунд на строку, НО, это также включая фактическую обработку чисел! Мы делаем Count (не нуль), общее количество, Sum, Min, Max, Avg, Median. Итак, у нас есть 7 операций над этими отфильтрованными строками.
Таким образом, мы можем сказать, что на самом деле она в 7 раз быстрее, чем те базы данных, которые мы пробовали, поскольку в этих случаях мы НЕ выполняем какие-либо действия по агрегированию!
Итак, в заключение, почему базы данных так плохо фильтруют данные по сравнению с фильтрацией LINQ в памяти? Неужели Microsoft так хорошо поработала, что с ней невозможно конкурировать? :)
Есть смысл в том, что фильтрация в памяти должна быть быстрее, но мне не нужно ощущение, что она быстрее. Я хочу знать, что работает быстрее и, если возможно, почему.