Я - случайный программист Python, кто только работал до сих пор с базами данных MYSQL или SQLITE. Я - компьютерный человек для всего в небольшой компании, и я был запущен новый проект, где я думаю, что пора попробовать новые базы данных.
Отдел продаж делает дамп CSV каждую неделю, и я должен подать маленькую заявку сценариев, которые разрешают форме людей другие отделы, смешивающие информацию, главным образом связывая записи. Мне решили все это, моей проблемой является скорость, я использую просто текстовые файлы для всего этого, и неудивительно это очень медленно.
Я думал об использовании mysql, но затем мне нужна установка mysql в каждом рабочем столе, sqlite легче, но это очень медленно. Мне не нужна полная реляционная база данных, просто некоторый способ игры с большими объемами данных в достойное время.
Обновление: Я думаю, что не был очень подробен о своем использовании базы данных, таким образом объяснив мою проблему плохо. Я работаю, считывая все данные ~900 Megas или больше от csv в словарь Python, затем работающий с ним. Моя проблема хранит и главным образом считывает данные быстро.
Большое спасибо!
"получить всех пользователей, которые работают в отделе x"
"получить все продажи от пользователя x"
Я компьютерщик для всего в небольшой компании, и я начал новый проект, в котором я думаю, что пора опробовать новые базы данных.
Вы уверены, что вам нужна база данных для решения вашей проблемы. Сделать это самостоятельно, используя только словарь Python, сложно. Особенно, когда ваш набор задач не умещается в памяти.
Я думал об использовании mysql, но затем мне нужно установить mysql на каждый рабочий стол, sqlite проще, но он очень медленный. Мне не нужна полная реляционная база данных, просто какой-то способ поиграть с большими объемами данных в приличное время.
Централизованная (архитектура клиент-сервер) база данных - это именно то, что вам нужно для решения вашей проблемы. Предоставьте всем пользователям доступ к базе данных с 1 ПК, которым вы управляете. Вы можете использовать MySQL для решения своей проблемы .
Вы также можете использовать Токийский тиран для хранения всех ваших данных.Tokyo Tyrant довольно быстр, и его не нужно хранить в оперативной памяти. Он обрабатывает получение данных более эффективно (вместо использования словаря Python). Однако, если ваша проблема может полностью уместиться в памяти, я думаю, вам стоит взглянуть на Redis (ниже).
Вы можете, например, использовать Redis (быстрый старт за 5 минут) (Redis очень быстрый) для хранения всех продаж в памяти. Redis чрезвычайно мощный и может безумно быстро выполнять такие запросы. Единственная проблема Redis заключается в том, что он должен полностью умещаться в RAM , но я считаю, что он работает над этим (ночная сборка уже поддерживает это). Также, как я уже сказал ранее, решение проблемы полностью из памяти - это то, как большие сайты решают эту проблему своевременно.
В этой статье делается попытка оценить kv-хранилища с хранилищами документов, такими как couchdb / riak / mongodb. Эти магазины лучше подходят для поиска (немного медленнее, чем магазины KV), но не подходят для полнотекстового поиска.
Если вы хотите выполнять полнотекстовые поисковые запросы, вам может быть интересно по адресу:
Похоже, у каждого отдела есть своя феодальная база данных, а это подразумевает излишнюю избыточность и неэффективность.
Вместо того, чтобы передавать сотни мегабайт всем в вашей сети, почему бы не хранить ваши данные в MySQL и не заставить отделы загружать свои данные в базу данных, где они могут быть нормализованы и доступны всем?
По мере роста вашей организации наличие совершенно разных ведомственных баз данных, которые не знают друг друга и содержат потенциально избыточные или противоречивые данные, станет очень болезненным.
Имеет ли машина, на которой выполняется этот процесс, достаточно памяти и пропускной способности, чтобы справиться с этим эффективно? Размещение MySQL на медленной машине и перекодирование инструмента для использования MySQL, а не текстовых файлов, потенциально может оказаться гораздо более дорогостоящим, чем простое добавление памяти или обновление машины.
Если у вас есть эта проблема с файлом CSV, возможно, вы можете просто обработать словарь и сгенерировать «двоичный» файл pickle с опцией pickle.HIGHEST_PROTOCOL
. Это может быть быстрее для чтения, и вы получите файл меньшего размера. Вы можете загрузить файл CSV один раз, а затем сгенерировать обработанный файл, что позволит ускорить загрузку при следующих обращениях.
В любом случае, имея 900 Мб информации, вам придется некоторое время загружать ее в память. Другой подход заключается в том, чтобы не загружать его на одном этапе в память, а загружать только информацию, когда это необходимо, возможно создание разных файлов по дате или любой другой категории (компания, тип и т. Д.)
Выполняли ли вы какую-либо оценку производительности, чтобы подтвердить, что именно текстовые файлы замедляют вашу работу? Если вы этого не сделали, есть большая вероятность, что настройка какой-либо другой части кода ускорит процесс, чтобы он был достаточно быстрым.
Вам, вероятно, действительно понадобится полноценная реляционная СУБД, если не сейчас, то очень скоро. Если вы начнете сейчас, когда ваши проблемы и данные просты и понятны, тогда, когда они станут сложными и трудными, у вас будет большой опыт работы по крайней мере с одной СУБД, чтобы помочь вам. Вероятно, вам не нужен MySQL на всех настольных компьютерах, вы можете установить его, например, на сервер и передавать данные по сети, но вам, возможно, потребуется предоставить дополнительную информацию о ваших требованиях, наборе инструментов и оборудовании, чтобы получить лучшие предложения.
И хотя у других СУБД тоже есть свои сильные и слабые стороны, в MySQL нет ничего плохого для больших и сложных баз данных. Я не знаю достаточно о SQLite, чтобы делать какие-либо комментарии по этому поводу.
РЕДАКТИРОВАТЬ: @Eric из ваших комментариев к моему ответу и другим ответам, я еще сильнее формирую мнение о том, что вам пора перейти к базе данных. Я не удивлен, что попытки выполнять операции с базой данных в словаре Python размером 900 МБ выполняются медленно. Я думаю, вам нужно сначала убедить себя, а затем свое руководство, что вы достигли пределов того, с чем может справиться ваш текущий набор инструментов, и что будущие разработки находятся под угрозой, если вы не переосмыслите ситуацию.
Если ваша сеть действительно не может поддерживать серверную базу данных, чем (а) вам действительно нужно сделать вашу сеть устойчивой, надежной и достаточно производительной для этой цели, но (б) если это не вариант, или не первый вариант, вы должны думать о том, что центральный сервер базы данных раздает дайджесты / извлечения / отчеты другим пользователям, а не одновременную полную СУБД, работающую в конфигурации клиент-сервер.
Проблемы, с которыми вы сейчас сталкиваетесь, связаны с отсутствием подходящих инструментов для работы. Им будет только хуже. Я хотел бы предложить волшебный способ, которым это не так, но я не могу и не думаю, что это сделает кто-то другой.
Вот сравнительный анализ производительности различных баз данных. Database Speed Comparison
Я не уверен, насколько объективно вышеприведенное сравнение, хотя, учитывая, что оно размещено на sqlite.org. Sqlite кажется немного медленнее только при сбросе таблиц, в остальном у вас не должно возникнуть никаких проблем с его использованием. И sqlite, и mysql, похоже, имеют свои сильные и слабые стороны, в некоторых тестах один быстрее другого, в других - наоборот.
Если вы столкнулись с более низкой, чем ожидалось, производительностью, возможно, причиной этого является не sqlite, делали ли вы профилирование или что-то еще, чтобы убедиться, что ничто другое не вызывает неправильного поведения вашей программы?
EDIT: Обновлено ссылкой на более свежее сравнение скорости.
Прошло несколько месяцев с тех пор, как я разместил этот вопрос, и я хотел бы сообщить вам, как я решил эту проблему. Я использую Berkeley DB с модулем bsddb вместо загрузки всех данных в словарь Python. Я не полностью доволен, но мои пользователи довольны. Мой следующий шаг - попытаться получить общий сервер с Redis, но, если пользователи не начнут жаловаться на скорость, я сомневаюсь, что получу это. Большое спасибо всем, кто помогал здесь, и я надеюсь, что этот вопрос и ответы будут полезны кому-то еще.