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

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

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

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

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

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

15
задан Eric 6 April 2010 в 19:06
поделиться

9 ответов

Краткое описание

  • Для эффективного решения проблемы вам требуется достаточно памяти (ОЗУ).Думаю стоит обновить память ?? Читая отличный блог 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 будет сложной задачей. Не могли бы вы формализовать запрос, который хотите выполнить? Например:
    • "получить всех пользователей, которые работают в отделе x"
    • "получить все продажи от пользователя x"

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

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

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

MySQL

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

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

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

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

Redis:

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

Хранилища документов

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

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

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

  • elasticsearch (видео) : Когда я увидел видео, демонстрирующее elasticsearch, это выглядело довольно круто . Вы можете попробовать поместить (опубликовать простой json) свои данные в elasticsearch и посмотреть, насколько это быстро. Я слежу за elastissearch на github, и автор добавляет в него много нового кода.
  • solr (учебник) : Многие крупные компании используют solr (github, digg) для поддержки поиска. Они получили большой импульс от полнотекстового поиска MySQL до solr.
16
ответ дан 1 December 2019 в 01:45
поделиться

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

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

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

1
ответ дан 1 December 2019 в 01:45
поделиться

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

1
ответ дан 1 December 2019 в 01:45
поделиться

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

0
ответ дан 1 December 2019 в 01:45
поделиться

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

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

0
ответ дан 1 December 2019 в 01:45
поделиться

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

1
ответ дан 1 December 2019 в 01:45
поделиться

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

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

РЕДАКТИРОВАТЬ: @Eric из ваших комментариев к моему ответу и другим ответам, я еще сильнее формирую мнение о том, что вам пора перейти к базе данных. Я не удивлен, что попытки выполнять операции с базой данных в словаре Python размером 900 МБ выполняются медленно. Я думаю, вам нужно сначала убедить себя, а затем свое руководство, что вы достигли пределов того, с чем может справиться ваш текущий набор инструментов, и что будущие разработки находятся под угрозой, если вы не переосмыслите ситуацию.

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

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

12
ответ дан 1 December 2019 в 01:45
поделиться

Вот сравнительный анализ производительности различных баз данных. Database Speed Comparison

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

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

EDIT: Обновлено ссылкой на более свежее сравнение скорости.

1
ответ дан 1 December 2019 в 01:45
поделиться

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

1
ответ дан 1 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: