Быстрая обработка больших объемов данных - PullRequest
1 голос
/ 07 июля 2011

Я работаю над веб-приложением, в котором пользователь предоставляет параметры, и они используются для создания списка из 1000 лучших элементов из базы данных до 20 миллионов строк. Мне нужны все 1000 лучших товаров одновременно, и мне нужно, чтобы этот рейтинг происходил более или менее мгновенно с точки зрения пользователя.

В настоящее время я использую MySQL с пользовательской функцией для оценки и ранжирования данных, затем PHP берет их оттуда. Протестировано на базе данных из 1 млн строк, это занимает около 8 секунд, но мне нужна производительность около 2 секунд, даже для базы данных до 20 млн строк. Предпочтительно, это число должно быть еще ниже, чтобы приличная пропускная способность гарантировалась для 50 одновременных пользователей.

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

  • Данные для каждой строки, имеющие отношение к процессу оценки, составляют около 50 байтов на элемент.
  • Вставки и обновления в БД незначительны.
  • Каждый балл не зависит от других, поэтому баллы можно вычислять параллельно.
  • Из-за большого количества параметров и значений параметров результаты не могут быть предварительно рассчитаны.
  • Метод должен хорошо масштабироваться для нескольких пользователей одновременно
  • Чем меньше вычислительных ресурсов для этого требуется с точки зрения количества серверов, тем лучше.

Спасибо

Ответы [ 4 ]

1 голос
/ 07 июля 2011

Возможный подход заключается в загрузке (и последующем обновлении) всех данных в ОЗУ объемом около 1 ГБ и выполнении оценки и ранжирования вне MySQL на языке, подобном C ++.Это должно быть быстрее, чем MySQL.

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

0 голосов
/ 08 июля 2011

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

0 голосов
/ 07 июля 2011

Я бы сказал, что для такого рода проблем, если вы выполнили все очевидные оптимизации программного обеспечения (и мы не можем этого знать, поскольку вы ничего не упомянули о ваших программных подходах), вам следует попробовать некоторыесерьезная аппаратная оптимизация.Максимально используйте память на своих SQL-серверах и попытайтесь разместить ваши таблицы в памяти, где это возможно.Используйте SSD для хранения таблиц / индексов, для быстрой десериализации.Если вы работаете в кластере, подключите сеть к максимально возможной скорости сети.

0 голосов
/ 07 июля 2011

Если вы можете опубликовать запрос, с которым у вас возникли проблемы, можете помочь.

Хотя вот некоторые вещи. Убедитесь, что у вас есть индексы, созданные в базе данных. Убедитесь, что вы используете оптимизированные запросы и используете соединения вместо внутренних запросов.

...