|
|
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Помогите придумать алгоритм для добавления данных в таблицу. Ситуация такая: Есть много текстовых файлов (логи с событиями), которые для удобства обработки надо хранить в MySQL. Просто занести данные в базу, раскидав по полям, проблем не составляет, на любом языке программирования разобрал файлы и внёс строки. Но файлы пополняются. И следующим этапом надо вносить только новые строки . Немного расскажу о структуре лог-файла: Файлы с произвольными названиями (иногда они даже могут переименовываться). Файл может быть обнулён и вестись заново. Размер файлов может достигать гигабайта. Уникального идентификатора у записей внутри файлов нет (вначале идут: Дата, Время, Код устройства, и дальше сложное сгенерированное сообщение длинной от 10 байт до 10 килобайт, которое я разбираю на части и раскидываю в несколько десятков полей). Устройство может послать несколько сообщений в секунду, так что Дата+Время+КодУстройства не являются уникальными, но всё же я использую эту связку для проверки - внесены эти данные в базу или нет. В самом начале я не видел никаких проблем. Написал на Delphi программку, которая вначале делал запрос к базе данных, запрашивая список всех внесённых "Дата+Время+КодУстройства" (этот список в виде отсортированного массива храню в оперативке), и потом по очереди открывал все файлы, и построчно проверял - если "Дата+Время+КодУстройства" есть в списке внесённых - то пропускаю эту строку, если же это новая запись - то вношу. Но когда количество данных перевалило за несколько миллионов - стало тяжело держать массив в памяти. С другой стороны если подойти к задаче иначе - открывать файл, брать каждую строку и вначале запрашивать - есть ли такая строка в базе - то получается жутко долго (несколько миллионов лишних запросов), да и лог базы данных жутко увеличивается. Как бы напрямую этот вопрос не касается MySQL (ведь реализуется любым языком программирования), но я посчитал что именно у специалистов связанных с базами данных накоплен наибольший опыт обновления огромных таблиц, и они смотрят на это по другому. Подскажите как бы вы сделали сравнение какие записи надо вносить, а какие нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2015, 18:27:41 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Типичный подход: сначала реализуется подзадача загрузки даннызх, потом - подзадача пополнения рабочих данных и/или удаления дубликатов. Первая подзадача быстрее всего решается тривиальным LOAD DATA INFILE во временную таблицу (в подготовленную структуру). Желательно изначально готовить данные к загрузке так, чтобы они не требовали обработки в процессе импорта. Вторая подзадача решается либо запросом пополнения боевой таблицы записями из временной (тупо INSERT IGNORE), либо чисткой временной таблицы с последующим объединением частей (MERGE engine). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2015, 23:32:39 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
То есть вы предлагаете при каждом обновлении по новому загонять все данные в базу? Например я только что обновил данные, но через 15 минут я хочу ещё раз посмотреть свежую статистику (чтобы узнать что изменилось за 15 минут), и для этого мне опять загонять 6 миллионов записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 00:39:08 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSkyНапример я только что обновил данные, но через 15 минут я хочу ещё раз посмотреть свежую статистику (чтобы узнать что изменилось за 15 минут)так может, и загонять только новые данные, за эти самые 15 минут? или у вас и старые могут изменяться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 07:19:10 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSkyНапример я только что обновил данные, но через 15 минут я хочу ещё раз посмотреть свежую статистику (чтобы узнать что изменилось за 15 минут), и для этого мне опять загонять 6 миллионов записей?Если Вы можете отделить данные, поступившие за эти 15 минут, на стадии подготовки их к загрузке - глупо будет это не сделать, чтобы догрузить в БД только новые данные (пусть и с небольшим перекрытием - но гарантируя не-потерю данных). А если нет - то другого варианта просто не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 09:07:50 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
так какие бы логи небыли, есть ведь стандартное решение, ротация логов. выш не собираетесь гигабайты туда писать и до терабайта ити...чтото продумано, как обнулять периодически лог файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 13:16:42 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
а вставку да...лучше через инфайл делать. быстрее всего и как раз для вашего случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 13:17:08 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
AkinaЕсли Вы можете отделить данные, поступившие за эти 15 минут, на стадии подготовки их к загрузке...Разумеется я не могу выделить данные поступившие с момента последнего обновления. Иначе бы и вопроса никакого не было. Вопрос-то именно в этом и заключается - как произвести вставку только новых данных. Метод которым вставляю сейчас - занимает меньше двух минут. Около 30 секунд на выборку из базы идентификаторов уже вставленных данных, и дальше на обход всех файлов в среднем со скоростью около 100мб/с (то есть на 6Гб уходит около минуты), плюс время вставки новых данных. Но как говорил, выборка идентификаторов уже сейчас влезает в оперативку только если выгрузить все программы (файл подкачки не использую), и очевидно что в скором времени объём идентификаторов уже не будет вмещаться в оперативку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 14:19:55 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSkyРазумеется я не могу выделить данные поступившие с момента последнего обновления. Что-то мешает удалить/усечь файл лога после импорта?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 14:45:00 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSkyРазумеется я не могу выделить данные поступившие с момента последнего обновления.Но хотя бы приблизительно это сделать можно? пусть не всё устаревшее отсечётся, но дублей будет не миллион, а десяток тысяч, например... всё серверу пыхтеть поменьше. InterSkyОколо 30 секунд на выборку из базы идентификаторов уже вставленных данныхТо есть некий идентификатор всё-таки наличествует... ну и почему же нельзя выполнить предобработку, ориентируясь на него? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 14:50:08 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSkyAkinaЕсли Вы можете отделить данные, поступившие за эти 15 минут, на стадии подготовки их к загрузке...Разумеется я не могу выделить данные поступившие с момента последнего обновления. Иначе бы и вопроса никакого не было. Вопрос-то именно в этом и заключается - как произвести вставку только новых данных. Метод которым вставляю сейчас - занимает меньше двух минут. Около 30 секунд на выборку из базы идентификаторов уже вставленных данных, и дальше на обход всех файлов в среднем со скоростью около 100мб/с (то есть на 6Гб уходит около минуты), плюс время вставки новых данных. Но как говорил, выборка идентификаторов уже сейчас влезает в оперативку только если выгрузить все программы (файл подкачки не использую), и очевидно что в скором времени объём идентификаторов уже не будет вмещаться в оперативку. вообще конечно зря вы так с логами - не могу усечь и прочее, но в любом случае, чтото мне подсказывает что лог файл пишеться в конец. тоесть можно просто запоминать смещение от начала файла и его имя, что было обработанно. и потом ити по файлам, те что уже читали, смещаться и читать сразу новое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 15:30:43 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Тут наверно появилось недопонимание: я НЕ разработчик программы которая ведёт логи. Моя задача только дать статистику по собранной информации, для этого я её и скидываю в базу... И уже потом делаю всякую статистику. Я ни как не могу управлять логами, я не могу делать ротации, я не могу получить даже время модификации файла, так как программа открывает их на запись и держит открытыми (то есть ни переименовать, не удалить тоже не получится так как файл LOCKED). Причём сам файл может и переименоваться, и удалиться, и обнулиться... Чтобы было немного понятней, объясню: это система сбора сигнализационной информации с мини телефонных станций. Я когда-то сам хранил в отдельной таблице все названия файлов и размер, до куда считаны данные. Но потом выявилось столько косяков. Время на мини телефонной станции может (устройстве) может не совпадать с моим (и в разных Time-зонах находятся и просто меняться для тестов, а иногда из-за сбоев). Устройства могут могут переноситься в другие регионы, и тогда меняется имя файла. Устройства могут меняться местами, тогда у них взаимно меняются названия. Размеры логов растут бесконечно, но если меняют прошивку устройства, то лог обнуляется (правда перед этим мастера удалённо запускают мою программу и данные не теряются). Я много модифицировал свою программу контроля за файлами: и хранил размер. Потом оказалось что файл обнулился и перерос сохранённый размер, тогда стал хранить последнюю переданную запись из файла. Потом файлы стали меняться названиями, тогда стал хранить и первую строку. Потом поменяются названиями и обнулятся и пополянтся чем-то... В общем мне надоело что постоянно косяки, потеря информации, ведь я борюсь против "чёрного ящика", и я стал прочёсывать все данные отказавшись от контроля за файлами. AkinaInterSkyРазумеется я не могу выделить данные поступившие с момента последнего обновления.Но хотя бы приблизительно это сделать можно? пусть не всё устаревшее отсечётся, но дублей будет не миллион, а десяток тысяч, например... всё серверу пыхтеть поменьше.Это уже смахивает на какой-то эвристический анализ с использованием искусственного интеллекта. Вот допустим я знаю что обновление делалось час назад. Открываю файл, а там последняя запись датирована шестью часами назад. Надо ли обрабатывать последние 10 тысяч строк? Нет? А станция находится в Time-зоне которая отличается от моей на 6 часов. Или открываю файл, а там последней записью идёт запись годовой давности. Надо ли обрабатывать последние 10 тысяч строк? Нет? А там была авария, куча сигнализационных сообщений пришло, потом приехали техники, сбросили настройки, и последними сообщениями пошли с неправильной датой. В ручную не всегда поймёшь надо ли обновлять, а на автоматическое решение вообще страшно полагаться. InterSkyОколо 30 секунд на выборку из базы идентификаторов уже вставленных данныхТо есть некий идентификатор всё-таки наличествует... ну и почему же нельзя выполнить предобработку, ориентируясь на него?[/quot]Я же в самом начале говорил - я использую связку "Дата+Время+КодУстройства". Хоть это и не уникальный идентификатор, так как может прийти несколько разных сигнализаций в секунду, но всё же я считаю что если я вносил эту связку, то значит весь тот блок внесён. А так только MD5 делать для контроля уникальности каждой строки. alex564657498765453выш не собираетесь гигабайты туда писать и до терабайта ити...чтото продумано, как обнулять периодически лог файл. Как уже писал - это не отменя зависит. Ротацияю сделать не могу, файлы Locked. Да и не в моей компетенции это. Чисто гипотетически: Я его в архив отправил, а его переименовали, и потом в архиве его с другим путать будут. alex564657498765453тоесть можно просто запоминать смещение от начала файла и его имя, что было обработанно.Опять же я писал, что именно с этого я и начинал. Потом столько раз накололся на этом из-за разных манипуляций с файлами, что после многократного переписывания алгоритма в сторону усиления контроля, в конце решил от этого отказаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 17:02:34 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Подменяешь физический файл пайпом на другой конец которого садишь свою программу заливки в БД. Всё, телемаркет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 15:03:15 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПодменяешь физический файл пайпом на другой конец которого садишь свою программу заливки в БД. Всё, телемаркет.Можно хоть один намёк как это делается в виндоусе? Тут надо сразу учесть что имён файлов я заранее не знаю (99% конечно знаю, но как говорил выше: они могут создаваться и переименовываться), и следовательно второй вопрос - можно ли подключить к пайпу файл который уже Locked (открыт на запись)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 17:11:28 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSky, Н-да ... озадачили. Я бы наверное поступил так: Заливал бы новый файл во временную табличку "как есть", весь целиком, а уже потом, сравнивал бы с тем что есть в основной табличке по тем или иным критериям (дата/время+код устройства+имя файла) тупо запросами и добавлял бы в основную табличку только то, что отсутствует... временную - "к терапевту" после обработки. Разве что ещё, вел бы "синонимию" переименованных файлов и, возможно, какую-то ещё "историю" заливок (ну там, смещение с которого Вы начинали). Даже если файл обнуляется или переименовывается или чего ишо с ним происходит - согласитесь, это не так часто происходит как необходимость добавления данных в вашу статистику. Проще в случае такого "катаклизма" пошаманить "историю" вручную, чем изголяться непонятно каким способом... тем более, что сами пишете что "не всегда и глазом-то видно"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 07:32:35 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Arhat109Заливал бы новый файл во временную табличку "как есть", весь целиком, а уже потом, сравнивал бы с тем что есть в основной табличке по тем или иным критериям (дата/время+код устройства+имя файла) тупо запросами и добавлял бы в основную табличку только то, что отсутствует... Из давнего опыта. На объёмных и нагруженных данных при большом объёме пополнения и высоком соотношении дубликат/оригинал (и даже предметная область та же - логи) у меня оказалось, что гораздо быстрее выполнить копирование оригиналов в ещё одну временную таблицу, а потом безусловную вставку из неё, чем вставку только того, что отсутствует. Впрочем, возможно, сказалось то, что дисковая подсистема была хорошая, а вот с памятушечкой не очень... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 09:14:03 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSkyМожно хоть один намёк как это делается в виндоусе? Тут надо сразу учесть что имён файлов я заранее не знаю (99% конечно знаю, но как говорил выше: они могут создаваться и переименовываться) Значит надо найти способ принудительно указать программе, что логи надо писать исключительно в файл с именем типа \\.\pipe\MySuperLogFile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 14:52:31 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSky И следующим этапом надо вносить только новые строки . Так проблем нет. Ты сначала решаешь, что значит "новые строки" -- т.е. ты должен каждую строку как-то идентифицировать. Далее -- на этот ключ ты создаёшь уникальный индекс. Поиск по индексу -- O(log N). После этого каждая вставляемая строка проверяется на наличие в БД, и вставлятся, если её нет. Всё. (почти) Линейно по кол-ву вставляемых данных. InterSky С другой стороны если подойти к задаче иначе - открывать файл, брать каждую строку и вначале запрашивать - есть ли такая строка в базе - то получается жутко долго (несколько миллионов лишних запросов), Это быстро. O(log N). InterSky да и лог базы данных жутко увеличивается. От проверки (операция чтения) логи базы не увеличиваются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 16:00:32 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSky, Добрый день. Кратко - смотреть в сторону ETL серверов. Остальное можно не читать. Если на пальцах. Есть пару подходов ETL (от англ. Extract, Transform, Load — дословно «извлечение, преобразование, загрузка»), и ELT (порядок букв поменялся). 1) Начнем со второго ELT (Extract, Load, Transform). По этапам. Вытаскиваем данные- Extract из логов. Далее грузим в СУБД -Load. Далее на уровне СУБД производим преобразование данных Transform. Пост №2 17329595 . Основная нагрузка ложиться на сервер Mysql и тюниг нужно вести на там же. Обычно под сервера покупают нормальное железо. Недостатки: - Параметризация запросов (по названию таблиц, БД, схем). - При переезде на другую СУБД (переделываем все заново). - Нагрузка на СУБД (для некоторых проектов очень критична). 2) ETL. Вытаскиваем данные- Extract из логов. Производим преобразование данных на уровне приложения - Transform. Далее все грузим в СУБД Load. Основная нагрузка на машину с ETL сервером. В данном случае это ваша прога на Delphi. Оба подхода применяются. Вопрос где проще совершить тюнинг и есть ли специалисты. Если рассматривать ETL сервера на примере pentaho data integration CE, то основными недостатки (которые мне кажутся актуальны для решения вышей задачи): - не оптимальное соединение таблиц (на СУБД это делается эффективнее). - сортировка данных. Плюсы: - чтение практически любых источников данных. - возможность параллельного исполнения блоков (последовательности команд, трансформаций, заданий). - возможность исполнять на удаленных машинах. Одна главная, остальные ведомые. - при смене СУБД (минимальные переделывание проекта). В идеале только меняем настройки подключения. - данные поступают частями. обработал часть 50 тыс. строк, закинул куда надо. Следом взял следующую порцию. (возможность обработки данных на слабых машинах). - полное логирование всех процессов. - использование переменных. (Параметризация SQL запросов, подключения к СУБД, и другого ...) - показ скорости работы каждого шага. Понимаете где слабое место. - возможность разработки ELT и ETL логики. - возможность запуска из командной строки. - bulk loaders. - возможность использование Java кода внутри ETL. - наличие документации (но не очень качественная. У других продуктов, но платных, доки лучше и примеров больше). ..... ИМХО. Вы уперлись в костыль, а именно ваша прога. Пока это выход, но с переделкой на параллельное исполнение и прочее у вас может уйти куча времени. Проще освоить ETL сервер. Да и шанс, что кто-нибудь разберется в ваших ETL процессах выше, чем в вашем коде. (Не в обиду, а просто из своей практики писания кода). PS. Можете задать вопрос в раздел форума "OLAP и DWH", там больше специалистов по ETL серверам. Но каждая задача индивидуальная и не факт, что под вашу задачу вы найдете уже готовое решение. При любом случае нужно пилить. С уважением, biwed.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 06:08:14 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
biwed.ruInterSky, Добрый день. Кратко - смотреть в сторону ETL серверов. Остальное можно не читать. И при чём тут ETL ? Или ты веточкой ошибся ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 13:48:15 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
у файлов же даты создания есть, на них и ориентируйся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 14:02:00 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
На вашем месте я бы смотрел в сторону доработки источника, в частности необходимо чтобы система пишущая лог идентифицировала их. Так работают все промышленные решения даже Oracle все свои логи идентифицирует по SCN - System Change Number. Если все таки нет возможности изменить источник можно подумать в сторону "виртуализации" файла с логом и перенаправить систему генерирующую лог на ваш виртуальный файл.Эта идея на концептуальном уровне и не спрашивайте как это сделать я вам не отвечу:). Другими словами сделать шину между генерилкой логов и конечным физическим файлом. Задача данной шины будет только одна идентифицировать любую активность источника как новую запись. При этом подходе даже команды удаление логов можно идентифицировать и анализировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 14:57:38 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovInterSkyМожно хоть один намёк как это делается в виндоусе? Тут надо сразу учесть что имён файлов я заранее не знаю (99% конечно знаю, но как говорил выше: они могут создаваться и переименовываться)Значит надо найти способ принудительно указать программе, что логи надо писать исключительно в файл с именем типа \\.\pipe\MySuperLogFileТак я и имел в виду это спрашивая - "Можно хоть один намёк как это делается в виндоусе?" Я верю что такое возможно в *nix'ах, но не слышал чтобы в виндоусе можно было заставить чужую перенаправить в пайп. MasterZivInterSkyС другой стороны если подойти к задаче иначе - открывать файл, брать каждую строку и вначале запрашивать - есть ли такая строка в базе - то получается жутко долго (несколько миллионов лишних запросов), Это быстро. O(log N).Может я делаю что-не не правильно, но у меня на это уходит несколько часов. В то время как поиск по отсортированному массиву в памяти проходит за пару минут. Что в общем-то логично, ведь MySQL обязан выполнять кучу действий при каждом запросе: разбор парсером моего запроса, проверка наличия кеша, запись лог файлов. Я больше ста проверок в оперативке сделаю только за время пока MySQL распарсит мой запрос. MasterZivInterSkyда и лог базы данных жутко увеличивается.От проверки (операция чтения) логи базы не увеличиваются.Это бинарный не пишет, а текстовый пишет... Мне репликация не нужна, а глазками на причину возникающих проблем всегда хочется посмотреть. bochkovу файлов же даты создания есть, на них и ориентируйсяФайлы Locked, у них даже дата иногда не меняется месяцами, поскольку программа их держит открытыми (при этом данные внутри нарастают). ams_arНа вашем месте я бы смотрел в сторону доработки источника, в частности необходимо чтобы система пишущая лог идентифицировала их.Если можно было доработать источник, я бы напрямую данные в базу кидал бы :) ams_arЕсли все таки нет возможности изменить источник можно подумать в сторону "виртуализации" файла с логом и перенаправить систему генерирующую лог на ваш виртуальный файл.Это очень похоже на идею Dimitry Sibiryakov о пайпах. Но вопрос - Как это сделать в винде? :) В общем в я пока пришёл к двум мыслям: 1) Создать в базе временную таблицу из одного поля, куда каждый раз закидываю все "Дата+Время+КодУстройства" которые есть во всех текстовых файлах. Потом силами MySQL нахожу только новые, и повторно оббегаю все логи, забирая только те записи которые попали в список новых. Близкие этой мысли высказывали Akina и Arhat109. Но я считаю этот метод ужасным! Ведь по сути я перебрасываю на MySQL то, с чем столкнулся сам - скоро эти списки не будут помещаться в оперативной памяти, а во сколько выльется проверка при использовании кеша, думаю можно представить. 2) Сделать самому бинарную систему поиска. Открываю лог-файл, беру центральную строку и проверяю её наличие в базе данных. Если нету такой записи - иду на середину в лево (на строку находящуюся на 25-том проценте лога), а если такая строка уже внесена, то иду на правую середину (на строку находящуюся на 75-том проценте лога). В общем бинарно разбивая файл на части пока не найдё то место с которого пошли новые записи. Можно ещё вначале сразу в одном запросе запросить наличие первой и последней записи в файле (если в ответ база даст две строки - значит файл полностью внесён и его трогать не надо, а если база скажет что ничего не найдено, то значит файл можно записывать целиком, так как он никогда не вносился). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 16:20:29 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
Добрый день. Не много удивился. MasterZivbiwed.ruInterSky, Добрый день. Кратко - смотреть в сторону ETL серверов. Остальное можно не читать. И при чём тут ETL ? Или ты веточкой ошибся ? Объясню почему. 1) тема сообщения "Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?". Один из ответов использовать ETL сервер. Ответ будет тот же самый "Как правильней вставить НОВЫЕ данные в более чем 100 миллионную таблицу?". 2) Есть некоторые проблемы с очисткой и верификацией данных. Один из ответов использовать ETL. 3) Не явно присутствует вопрос что делать, если самописный ETL (на Delphi) уже не справляется с задачей? Один из ответов реализовывать идеи у ETL серверов. Какие идеи привел выше. 4) Сколько займет реализация идей на Delphi? Может взять посмотреть в сторону альтернативы? Альтернатива приведена. Даже в том случае если придется делать аналогичную задачу на linux. Сколько кода вы сохраните при переезде на другую ОС? 5) Задача фильтрации является одной из стандартных для ETL процессов (не для ELT). На опыте могу сказать, наибольшая производительность достигается только при помещении всех данных в КЭШ. Тогда фильтрация возрастает в разы. Если выделение памяти не возможно, то следующая стратегия помещение в кэш данных части данных. Например выборка данных с кодами устройств, которые присутствуют в логе. Идея для оптимизации программы на Delphi. 6) Теперь уже стало ясно, все предлагают пилить Delphi. Где взять идеи? В литературе по ETL. Понимать как ведет себя ETL сервер. 7) Пока, что я вижу что все советы стандартные. Перекинуть в СУБД и все там обработать. По оценкам должно быстро для нескольких миллионов. А будет ли так же быстро если вставки будут проходить в 100 М таблицу и более? 8) По поводу отсечения логов, то мне не понятно, можно ли гарантировать полноту данных, если у вас произошел сбой в СУБД и она откатилась на n дней назад? 9) можно предложить вариант с супер логом. Писать все логи в один супер лог. Данные в супер логе скорее всего будут упорядочены по "КодУстройства+Дата+Время" считываем 50 000 строк в буфер №1. Делаем запрос 50 000 из СУБД (пункт 5) отсортированные в том же порядке в другой буфер №2. Думаю пояснять не надо для чего нужна сортировка. Сравниваем данные буферов. Буфер №2 всегда должен иметь запись более позднюю (догружаем данные если надо, следующие n строк), чем в буфере №1. Тогда определение кандидата на вставку присутствие в буфере №1 и отсутствие в буфере №2. Определили кандидата - инсертим в Mysql таблицу. Удаляем эти строки из буфера №1. Как буфер №1 стал пустой, догружаем очередную партию. И так далее. Пока не осталось данных. Возможно этот вариант будет самым быстрым из ETL. Но при этом надо делать замеры скорости и понимать в чем затык. А так ходьба в слепую. PS. Надеюсь ответил на вопрос, причем тут ETL сервера. Но с другой стороны оно вам надо? Форум все же по MySQL, как правильно заметили. Одно странно, почему только я получил вопрос от пользователя MasterZiv, так как пайлы, ротация логов и все остальное тоже не имеют отношение к MySQL. С уважением, biwed.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2015, 04:23:53 |
|
||
|
Как правильней вставить НОВЫЕ данные в многомиллионную таблиу?
|
|||
|---|---|---|---|
|
#18+
InterSky, От проверки (операция чтения) логи базы не увеличиваются. Это бинарный не пишет, а текстовый пишет... Мне репликация не нужна, а глазками на причину возникающих проблем всегда хочется посмотреть. ну так выключи лог вообще, если не нужна репликация . нужны запросы - включи slow query log. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2015, 08:19:37 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38891940&tid=1833465]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 337ms |

| 0 / 0 |
