Лучшая база данных DataMining - PullRequest
       25

Лучшая база данных DataMining

15 голосов
/ 05 апреля 2010

Я случайный программист на Python, который до сих пор работал только с базами данных MYSQL или SQLITE. Я - компьютерщик всего в небольшой компании, и я начал новый проект, где, я думаю, пришло время попробовать новые базы данных.

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

Я думал об использовании mysql, но тогда мне нужно установить mysql на каждый рабочий стол, sqlite проще, но он очень медленный. Мне не нужна полная реляционная база данных, просто какой-то способ игры с большими объемами данных в достойное время.

Обновление: я думаю, что не очень подробно рассказывал об использовании моей базы данных, поэтому плохо объяснил свою проблему. Я работаю, читая все данные ~ 900 Мегас или больше из CSV в словарь Python, а затем работаю с ним. Моя проблема заключается в хранении и в основном быстром чтении данных.

Большое спасибо!

Ответы [ 9 ]

16 голосов
/ 06 апреля 2010

Краткое резюме

  • Вам нужно достаточно памяти (RAM) для эффективного решения вашей проблемы. Я думаю, вы должны обновить память ?? Читая отличный блог High Scalability , вы заметите, что для больших сайтов, чтобы эффективно решить проблему, они хранят полный набор проблем в памяти.
  • Вам необходимо решение для центральной базы данных. Я не думаю, что ручная работа с Python-словарем только сделает работу.
  • Как решить «вашу проблему», зависит от вашего «запроса». Сначала я бы попытался поместить ваши данные в эластичный поиск (см. Ниже) и выполнить запрос к базе данных (посмотреть, как она работает). Я думаю, что это самый простой способ решить вашу проблему. Но, как вы можете прочитать ниже, есть много способов решить вашу проблему.

Мы знаем:

  • Вы использовали Python в качестве языка вашей программы.
  • Ваша база данных ~ 900 МБ (я думаю, она довольно большая, но абсолютно управляемая).
  • Вы загрузили все данные в словарь Python. Здесь я предполагаю, что проблема лежит. Python пытается сохранить словарь (также словарь Python не самый удобный для памяти) в вашей памяти, но у вас недостаточно памяти ( Сколько у вас памяти ???? ). Когда это произойдет, у вас будет много виртуальной памяти . Когда вы пытаетесь прочитать словарь, вы постоянно меняете данные с диска в память. Этот обмен вызывает " Trashing ". Я предполагаю, что вашему компьютеру не хватает оперативной памяти. Если это правда, то я сначала обновил бы вашу память, по крайней мере, на 2 гигабайта дополнительной оперативной памяти. Когда ваш набор задач сможет поместиться в памяти, решение проблемы будет намного быстрее Я открыл книгу о своей компьютерной архитектуре, где говорится (иерархия памяти), что время доступа к основной памяти составляет около 40-80 нс, а время доступа к дисковой памяти - 5 мс. Это большая разница.

Отсутствует информация

  • У вас есть центральный сервер. Вы должны использовать / иметь сервер.
  • Какая архитектура у вашего сервера? Linux / Unix / Windows / Mac OSX? По моему мнению, ваш сервер должен иметь архитектуру Linux / Unix / Mac OSX.
  • Сколько памяти имеет ваш сервер?
  • Не могли бы вы указать свой набор данных (CSV) немного лучше.
  • Какой вид добычи данных вы делаете? Вам нужны возможности полнотекстового поиска? Я не предполагаю, что вы делаете какой-либо сложный (SQL) запрос. Выполнение этой задачи с использованием только словарей Python будет сложной задачей. Не могли бы вы формализовать запрос, который вы хотели бы выполнить? Например:
    • "get all users who work for departement x"
    • "get all sales from user x"

Требуется база данных

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

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

MySQL

Я думал об использовании mysql, но потом Мне нужно установить MySQL в каждом рабочий стол, sqlite проще, но это очень медленно. Мне не нужен полный реляционная база данных, просто какой-то способ играть с большими объемами данных в приличное время.

Централизованная (клиент-серверная) база данных - это именно то, что вам нужно для решения вашей проблемы. Предоставьте всем пользователям доступ к базе данных с 1 компьютера, которым вы управляете. Вы можете использовать MySQL для решения вашей проблемы .

Токийский тиран

Вы также можете использовать Токийский тиран для хранения всех ваших данных. Токийский тиран работает довольно быстро, и его не нужно хранить в оперативной памяти. Это делает получение данных более эффективным (вместо использования словаря Python). Однако, если ваша проблема может полностью уместиться в памяти, я думаю, вам стоит взглянуть на Redis (ниже).

Redis:

Вы можете, например, использовать Redis (быстрый запуск через 5 минут) (Redis очень быстро), чтобы сохранить все продажи в памяти. Redis чрезвычайно мощный и может делать такие запросы безумно быстро. Единственная проблема с Redis состоит в том, что он должен полностью уместиться в RAM , но я считаю, что он работает над этим (ночная сборка уже поддерживает это). Также, как я уже говорил ранее, решение вашей проблемы полностью из памяти - это то, как большие сайты решают эту проблему своевременно.

Магазины документов

Эта статья пытается оценить kv-хранилища с хранилищами документов, такими как couchdb / riak / mongodb. Эти магазины лучше способны искать (немного медленнее, чем магазины KV), но не полны полнотекстового поиска.

Полный текст-поиск

Если вы хотите выполнять полнотекстовые поисковые запросы, вы можете набрать:

  • asticsearch (видео) : Когда я увидел демонстрацию видео эластичного поиска, это выглядело довольно круто. Вы можете попробовать поместить (опубликовать простой json) свои данные вasticsearch и посмотреть, насколько быстро это происходит. Я следую за elastissearch на github, и автор добавляет в него много нового кода.
  • solr (учебное пособие) : Многие крупные компании используют solr (github, digg) для поиска. Они получили большой импульс от полнотекстового поиска MySQL до solr.
12 голосов
/ 05 апреля 2010

Вам, вероятно, понадобится полноценная реляционная СУБД, если не прямо сейчас, то очень скоро.Если вы начнете сейчас, когда ваши проблемы и данные просты и понятны, тогда, когда они станут сложными и сложными, у вас будет достаточно опыта по крайней мере с одной СУБД, которая поможет вам.Возможно, вам не нужен MySQL на всех настольных компьютерах, вы можете установить его, например, на сервере и передавать данные по сети, но вам, возможно, потребуется предоставить больше информации о ваших требованиях, наборе инструментов и оборудовании, чтобы получить более точные предложения.

И, хотя другие СУБД также имеют свои сильные и слабые стороны, в MySQL нет ничего плохого для больших и сложных баз данных.Я не знаю достаточно о SQLite, чтобы комментировать об этом.,Я не удивлен, что попытки выполнять операции с базами данных на 900-мегабайтном словаре Python являются медленными.Я думаю, что вы должны сначала убедить себя, а затем свое руководство, что вы достигли пределов того, с чем может справиться ваш текущий набор инструментов, и что будущие разработки находятся под угрозой, если вы не переосмыслите вопросы.не поддерживает серверную базу данных, чем (а) вам действительно нужно сделать сеть надежной, надежной и производительной для такой цели, но (б) если это не вариант или не ранний вариант, вам следуетпродумывая аналогично тому, как центральный сервер баз данных передает дайджесты / выдержки / отчеты другим пользователям, а не одновременно, полную СУБД, работающую в конфигурации клиент-сервер.имея правильные инструменты для работы.Им будет только хуже.Я хотел бы предложить магический способ, которым это не так, но я не могу, и я не думаю, что кто-то еще будет.

1 голос
/ 05 июня 2010

Прошло несколько месяцев с тех пор, как я опубликовал этот вопрос, и я хотел, чтобы вы все знали, как я решил эту проблему. Я использую Berkeley DB с модулем bsddb вместо загрузки всех данных в словарь Python. Я не совсем счастлив, но мои пользователи. Мой следующий шаг - попытаться получить общий сервер с Redis, но если пользователи не будут жаловаться на скорость, я сомневаюсь, что получу это. Большое спасибо всем, кто помог здесь, и я надеюсь, что этот вопрос и ответы будут полезны для кого-то еще.

1 голос
/ 05 апреля 2010

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

1 голос
/ 05 апреля 2010

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

Вместо того, чтобы передавать сотни мегабайт всем пользователям в вашей сети, почему бы не сохранить ваши данные в MySQL и заставить департаменты загружать свои данные в базу данных, где они могут быть нормализованы и доступны каждому?

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

1 голос
/ 05 апреля 2010

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

1 голос
/ 05 апреля 2010

Вот эталон производительности для разных мастей баз данных -> Сравнение скорости базы данных

Я не уверен, насколько объективным является приведенное выше сравнение, поскольку оно размещено на sqlite.org . Sqlite только кажется немного медленнее при удалении таблиц, в противном случае у вас не должно возникнуть никаких проблем с его использованием. Кажется, что и sqlite, и mysql имеют свои сильные и слабые стороны, в некоторых тестах он быстрее, чем другой, в других тестах, верно обратное.

Если вы столкнулись с более низкой, чем ожидалось, производительностью, возможно, причиной этого не является sqlite, вы выполнили какое-либо профилирование или иным образом, чтобы убедиться, что ничто другое не приводит к неправильной работе вашей программы?

РЕДАКТИРОВАТЬ: Обновлено со ссылкой на немного более новое сравнение скорости.

0 голосов
/ 06 апреля 2010

Взгляните на mongodb.

0 голосов
/ 05 апреля 2010

Если у вас есть такая проблема с CSV-файлом, возможно, вы можете просто выбрать словарь и сгенерировать «двоичный» файл с параметром pickle.HIGHEST_PROTOCOL. Это может быть быстрее для чтения, и вы получите меньший файл. Вы можете загрузить CSV-файл один раз, а затем сгенерировать замаскированный файл, что позволит быстрее загружаться при следующем доступе.

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

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