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

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

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

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

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

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

Ответы

Ответ 1

Краткая сводка

  • Вам необходимо достаточно памяти (ОЗУ) для эффективного решения вашей проблемы. Я думаю, вы должны обновить память? При чтении превосходного High Scalability Блог вы заметите, что для больших сайтов, чтобы решить проблему, они сохраняют полную проблему, заданную в памяти.
  • Вам нужно решение для центральной базы данных. Я не думаю, что рука, выполняющая это с помощью словаря python, только выполнит эту работу.
  • Как решить "вашу проблему" зависит от вашего "запроса". Сначала я постараюсь сделать ваши данные в поиске эластичности (см. Ниже) и запросить базу данных (см., Как она выполняется). Я думаю, что это самый простой способ решить вашу проблему. Но, как вы можете прочитать ниже, есть много способов решить вашу проблему.

Мы знаем:

  • Вы использовали python в качестве языка вашей программы.
  • Ваша база данных ~ 900 МБ (я думаю, что довольно большой, но абсолютный управляемый).
  • Вы загрузили все данные в словарь python. Здесь я предполагаю, что проблема лежит. Python пытается хранить словарь (также словарь python не является наиболее запоминающимся для памяти) в вашей памяти, но у вас недостаточно памяти (Сколько у вас памяти????). Когда это произойдет, у вас будет много Virtual Memory. Когда вы пытаетесь прочитать словарь, вы постоянно меняете данные с вашего диска в память. При этом замене " Trashing". Я предполагаю, что на вашем компьютере не хватает Рама. Если true, то я бы сначала обновил свою память с дополнительной оперативной памятью объемом не менее 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 проще, но это очень медленно. Мне не нужен полный реляционной базы данных, играть с большими объемами данных в приличное время.

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

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

Вы также можете использовать Tokyo Tyrant для хранения всех ваших данных. 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.

Ответ 2

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

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

ИЗМЕНИТЬ: @Эрик из ваших комментариев к моему ответу и другим ответам, я еще более убеждаюсь в том, что пришло время переместить в базу данных. Я не удивлен, что попытка выполнить операции с базой данных на 900-мегабайтном Python-словаре медленна. Я думаю, вам нужно сначала убедить себя, а затем ваше руководство, что вы достигли предела того, с чем может справиться ваш нынешний инструментарий, и что будущие события находятся под угрозой, если вы не переосмыслите ситуацию.

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

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

Ответ 3

Ниже приведен пример производительности различных мастей базы данных → Сравнение скорости базы данных

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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