Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сравнить 1 000 000 записей из файла с данными из базы / 25 сообщений из 26, страница 1 из 2
05.03.2014, 12:01
    #38578731
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Всем привет!

как бы вы решили такую задачу:
Требуется сравнить 1 000 000 ( и более) записей и выдать различия , коих будет до 100
С одной стороны xml файл с 1 000 000 записей
С другой база данных с данными раскиданными по разным таблицам (имеется ввиду, что для того чтобы собрать одну запись для сравнения с данным из файлов нужно сходить в несколько таблиц)

Количество данных в базе тоже 1 000 000.

Какие идеи?
...
Рейтинг: 0 / 0
05.03.2014, 12:06
    #38578737
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
1) Выбираем параметры поиска записей
2) Создаём в БД индексы для этих параметров, чтобы выборка была максимально быстрой
3) Сканируем XML последовательно и ищем по БД, так как, очевидно, поиск в БД по индексам быстрее
4) 1 000 000 записей это фигня. Ограничения по времени не вижу постановке.
Всё остальное уже исходя из требований к производительности.

Какие вообще проблемы? Что пробовали? Почему не получилось? Какая проблема сделать SELECT из нескольких таблиц БД?
...
Рейтинг: 0 / 0
05.03.2014, 12:26
    #38578783
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly D,
"пиши на том что умеешь" - т.к. тебя силой силой не заставить делать сравнение через JOIN.
И проблема "сходить в несколько таблиц".
ЗЫ.
Различия это регистр букв или цифровой подписи?
...
Рейтинг: 0 / 0
05.03.2014, 12:26
    #38578784
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly D,

Имхо, самый быстрый вариант, я бы делал так:

1. Загрузил бы данные из xml в БД (скорее всего придется использовать SAX-парсер, т.к. файл очень большой)
2. Если позволяет логика сравнения, то запросом сравнил бы новые и старые данные (в самом простейшем варианте - оператор SQL INTERSECT или MINUS). Т.к. сравнение одним запросом будет скорее всего на несколько порядков быстрее, чем вариант, предложенный Blazkowicz, потому что многочисленные одиночные сравнения строк(даже при использовании индексов) работают гораздо медленнее.

Но если это одноразовая операция, то, мне кажется, не стоит заморачиваться, и делать так, как удобнее, потому что со сравнением миллиона строк сегодня справится даже домашний комп.
...
Рейтинг: 0 / 0
05.03.2014, 12:27
    #38578786
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
нашёл вариант:
БД выгрузить в XML и потом побайтово сравнить.
...
Рейтинг: 0 / 0
05.03.2014, 12:29
    #38578790
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
publexus,
- если там строки, то зачем XML
- если не строки, то там объекты (справичники) Один ко Многим
...
Рейтинг: 0 / 0
05.03.2014, 12:31
    #38578794
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly D,

1КК строк - это ни о чем. Можно и стандартными средствами парсинга обойтись.
Если строк будет в 10 раз хотя бы больше, написать свой filereader и не париться.
Алгоритм прост и описан во втором сообщении.
...
Рейтинг: 0 / 0
05.03.2014, 12:34
    #38578801
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Blazkowicz,

я в самом начале пути, ещё ничего не пробовал. Занимаюсь premature optimization. По другому и назвать сложно.

4) уложится в 10 минут - ограничение по времени.

Спасибо! пока писал ответное письмо решил много проблем реализации. :) Пойду по пути как Вы описали, с той лишь разницей, что буду выкачивать из базы кусками, а не по одному.

А если упрусь в производительность - подниму вопрос снова.
...
Рейтинг: 0 / 0
05.03.2014, 12:38
    #38578804
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
publexusсравнение одним запросом будет скорее всего на несколько порядков быстрее, чем вариант, предложенный Blazkowicz, потому что многочисленные одиночные сравнения строк(даже при использовании индексов) работают гораздо медленнее.
С фига ли там несколько порядков нарисуются, если нужен полный скан, как базы так и XML? Выгрузка XML в базу, все выдуманные порядки до нуля сведёт.
...
Рейтинг: 0 / 0
05.03.2014, 12:41
    #38578808
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
publexus,

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

И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно...
...
Рейтинг: 0 / 0
05.03.2014, 12:49
    #38578817
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly DПойду по пути как Вы описали, с той лишь разницей, что буду выкачивать из базы кусками, а не по одному.

Для оптимизаций надо уже смотреть конкретно на структуры. Если база нормализована, то приходится ли некоторые записи ассоциаций выбирать несколько раз для базовой таблицы? Если, да, то их можно закешировать на уровне Java.
Данные как-то упорядочены в XML? Если да, то, конечно, можно предварительно загрузить больше данных в память.
Объем данных считали уже? Сколько весит XML? А БД? Можно базу с индексами целиком в памяти развернуть и свети IO к нулю.
...
Рейтинг: 0 / 0
05.03.2014, 12:53
    #38578824
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly Dpublexus,

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

И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно...
непонятно что у вас за База.
Обычно - это предметная область, а не хранилище строк.
Там лежат только валидные данные. Нар. заключённые Договора.
Если там склад строк, то качать в БД конечно не надо.
В нормальную БД делают импорт с валидацией. Мусорки там нет.
...
Рейтинг: 0 / 0
05.03.2014, 12:53
    #38578825
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Petro123,

Ну так автор же не расписал как и что сравнивать, от этого тоже может многое зависеть.
Если там не только сравнение полей но и множеств (при условии множественных отношений) или иной сложный алгоритм сравнения, то тогда скорее всего сравнивать только по одной записи.
...
Рейтинг: 0 / 0
05.03.2014, 13:01
    #38578842
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Blazkowiczpublexusсравнение одним запросом будет скорее всего на несколько порядков быстрее, чем вариант, предложенный Blazkowicz, потому что многочисленные одиночные сравнения строк(даже при использовании индексов) работают гораздо медленнее.
С фига ли там несколько порядков нарисуются, если нужен полный скан, как базы так и XML? Выгрузка XML в базу, все выдуманные порядки до нуля сведёт.

Исхожу из личного опыта, т.к. уже много лет занимаюсь оптимизацией запросов (правда на Oracle).

если нужен полный скан, как базы так и XMLПолный скан будет по XML, а к базе для каждой записи XML будут однострочные запрос по индексу (как вы предлагали).

А почему скорость будет отличаться на порядки, то попробуйте ради интереса перебрать всю большую таблицу с доступом через индексу и полное сканирование и поймете.
...
Рейтинг: 0 / 0
05.03.2014, 13:07
    #38578854
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly Dpublexus,

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

И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно...

Загрузить однажды в базу и затем можно использовать SQL для сравнения (но это при условии что вы владеете XML).

На уровне БД сравнение будет происходить гораздо быстрее, однозначно, нежели парсить XML и на ходу искать в базе.
К тому при периодической необходимости при обновлении XML можно будет заливать только новые добавленные (или измененные) записи а не весь XML и сравнивать. А в случае варианта Blazkowicz вам придется снова обрабатывать весь XML.
...
Рейтинг: 0 / 0
05.03.2014, 13:46
    #38578922
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Пардон, в предыдущем посте ошибся
(но это при условии что вы хорошо владеете XML SQL)
...
Рейтинг: 0 / 0
05.03.2014, 15:05
    #38579079
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
BlazkowiczAnatoly DПойду по пути как Вы описали, с той лишь разницей, что буду выкачивать из базы кусками, а не по одному.

Для оптимизаций надо уже смотреть конкретно на структуры. Если база нормализована, то приходится ли некоторые записи ассоциаций выбирать несколько раз для базовой таблицы? Если, да, то их можно закешировать на уровне Java.
Данные как-то упорядочены в XML? Если да, то, конечно, можно предварительно загрузить больше данных в память.
Объем данных считали уже? Сколько весит XML? А БД? Можно базу с индексами целиком в памяти развернуть и свети IO к нулю.

XML порядка 300 MB, но буду разбивать по несколько XML поменьше.
А база 60 Гигов весит, развернуть-то можно, но не поймут меня. :)
Сейчас попробую "в лоб" решить, посмотрим, нужно ли будет оптимизировать вообще.
...
Рейтинг: 0 / 0
05.03.2014, 15:07
    #38579084
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Petro123Anatoly Dpublexus,

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

И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно...
непонятно что у вас за База.
Обычно - это предметная область, а не хранилище строк.
Там лежат только валидные данные. Нар. заключённые Договора.
Если там склад строк, то качать в БД конечно не надо.
В нормальную БД делают импорт с валидацией. Мусорки там нет.

да с чего вы взяли что там хранилище строк-то? :)
пример xml <record attr1="" attr2="" etc. attrN=""> и мапятся аттрибуты на разные таблицы, я не понимаю, почему я Вас не понимаю :)
...
Рейтинг: 0 / 0
05.03.2014, 15:09
    #38579085
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly DXML порядка 300 MB, но буду разбивать по несколько XML поменьше.

Ну, его предварительно грузить в память смысла особого нет. Стримить парсером, даже разбивать не нужно.

Anatoly DА база 60 Гигов весит, развернуть-то можно, но не поймут меня. :)

Вроде было всего 1М записией в постановке задачи :)

Anatoly DСейчас попробую "в лоб" решить, посмотрим, нужно ли будет оптимизировать вообще.
Во-во. Правильное решение.
...
Рейтинг: 0 / 0
05.03.2014, 15:10
    #38579086
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
publexusAnatoly Dpublexus,

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

И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно...

Загрузить однажды в базу и затем можно использовать SQL для сравнения (но это при условии что вы владеете XML).

На уровне БД сравнение будет происходить гораздо быстрее, однозначно, нежели парсить XML и на ходу искать в базе.
К тому при периодической необходимости при обновлении XML можно будет заливать только новые добавленные (или измененные) записи а не весь XML и сравнивать. А в случае варианта Blazkowicz вам придется снова обрабатывать весь XML.

XML - ежедневная сверка по сути. он будет одноразовым на один день. То бишь, прогнал сверку, всё сошлось - всем спасибо XML в архив и ждём следующего дня и следующую сверку.
...
Рейтинг: 0 / 0
05.03.2014, 15:13
    #38579091
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Blazkowicz
Anatoly DА база 60 Гигов весит, развернуть-то можно, но не поймут меня. :)

Вроде было всего 1М записией в постановке задачи :)



да там ваще много всего :) 1 мильён это для упрощенного описания. Так-то 1М - это ожидаемое количество новых добавлений в день.
...
Рейтинг: 0 / 0
05.03.2014, 15:20
    #38579104
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly Dда с чего вы взяли что там хранилище строк-то? :)
пример xml <record attr1="" attr2="" etc. attrN=""> и мапятся аттрибуты на разные таблицы, я не понимаю, почему я Вас не понимаю :)
- потому что соединения таблиц идут через справочники и ID
Если 2 таблицы ссылаются на таблицу городов 1000 строк, то такая структура не катит.
- потому что уникальный ID либо невыгружают, либо сравнение идёт без их участия.
Все ньюансы знаешь только ты.
...
Рейтинг: 0 / 0
05.03.2014, 15:23
    #38579106
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
ну, и если идти только от XML, то DELETE в БД - не отловить
...
Рейтинг: 0 / 0
05.03.2014, 19:17
    #38579423
17-77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
Anatoly D,

можно покопать в эту сторону:
1. сделать вьюху для данных в БД
2. сделать вьюху (запрос) к XML средствами БД
3. сравнение - тут несколько вариантов
- в лоб (джоин, индексы)
- использовать особенные возможности БД
- сделать поле уникального хеша по всей строке данных и сравнивать только хеш
...
Рейтинг: 0 / 0
05.03.2014, 20:20
    #38579479
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить 1 000 000 записей из файла с данными из базы
17-77,
Последний пункт самый интересный))).
...
Есть ещё Bulk Load MS. Но там нужен особый..их...xml
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сравнить 1 000 000 записей из файла с данными из базы / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]