|
|
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Всем привет! как бы вы решили такую задачу: Требуется сравнить 1 000 000 ( и более) записей и выдать различия , коих будет до 100 С одной стороны xml файл с 1 000 000 записей С другой база данных с данными раскиданными по разным таблицам (имеется ввиду, что для того чтобы собрать одну запись для сравнения с данным из файлов нужно сходить в несколько таблиц) Количество данных в базе тоже 1 000 000. Какие идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:01 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
1) Выбираем параметры поиска записей 2) Создаём в БД индексы для этих параметров, чтобы выборка была максимально быстрой 3) Сканируем XML последовательно и ищем по БД, так как, очевидно, поиск в БД по индексам быстрее 4) 1 000 000 записей это фигня. Ограничения по времени не вижу постановке. Всё остальное уже исходя из требований к производительности. Какие вообще проблемы? Что пробовали? Почему не получилось? Какая проблема сделать SELECT из нескольких таблиц БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:06 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly D, "пиши на том что умеешь" - т.к. тебя силой силой не заставить делать сравнение через JOIN. И проблема "сходить в несколько таблиц". ЗЫ. Различия это регистр букв или цифровой подписи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:26 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly D, Имхо, самый быстрый вариант, я бы делал так: 1. Загрузил бы данные из xml в БД (скорее всего придется использовать SAX-парсер, т.к. файл очень большой) 2. Если позволяет логика сравнения, то запросом сравнил бы новые и старые данные (в самом простейшем варианте - оператор SQL INTERSECT или MINUS). Т.к. сравнение одним запросом будет скорее всего на несколько порядков быстрее, чем вариант, предложенный Blazkowicz, потому что многочисленные одиночные сравнения строк(даже при использовании индексов) работают гораздо медленнее. Но если это одноразовая операция, то, мне кажется, не стоит заморачиваться, и делать так, как удобнее, потому что со сравнением миллиона строк сегодня справится даже домашний комп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:26 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
нашёл вариант: БД выгрузить в XML и потом побайтово сравнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:27 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
publexus, - если там строки, то зачем XML - если не строки, то там объекты (справичники) Один ко Многим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:29 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly D, 1КК строк - это ни о чем. Можно и стандартными средствами парсинга обойтись. Если строк будет в 10 раз хотя бы больше, написать свой filereader и не париться. Алгоритм прост и описан во втором сообщении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:31 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, я в самом начале пути, ещё ничего не пробовал. Занимаюсь premature optimization. По другому и назвать сложно. 4) уложится в 10 минут - ограничение по времени. Спасибо! пока писал ответное письмо решил много проблем реализации. :) Пойду по пути как Вы описали, с той лишь разницей, что буду выкачивать из базы кусками, а не по одному. А если упрусь в производительность - подниму вопрос снова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:34 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
publexusсравнение одним запросом будет скорее всего на несколько порядков быстрее, чем вариант, предложенный Blazkowicz, потому что многочисленные одиночные сравнения строк(даже при использовании индексов) работают гораздо медленнее. С фига ли там несколько порядков нарисуются, если нужен полный скан, как базы так и XML? Выгрузка XML в базу, все выдуманные порядки до нуля сведёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:38 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
publexus, думал и о вгрузке значений в базу данных, потом сделать дифф таблиц, но это сложно реализовывать. И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:41 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly DПойду по пути как Вы описали, с той лишь разницей, что буду выкачивать из базы кусками, а не по одному. Для оптимизаций надо уже смотреть конкретно на структуры. Если база нормализована, то приходится ли некоторые записи ассоциаций выбирать несколько раз для базовой таблицы? Если, да, то их можно закешировать на уровне Java. Данные как-то упорядочены в XML? Если да, то, конечно, можно предварительно загрузить больше данных в память. Объем данных считали уже? Сколько весит XML? А БД? Можно базу с индексами целиком в памяти развернуть и свети IO к нулю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:49 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly Dpublexus, думал и о вгрузке значений в базу данных, потом сделать дифф таблиц, но это сложно реализовывать. И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно... непонятно что у вас за База. Обычно - это предметная область, а не хранилище строк. Там лежат только валидные данные. Нар. заключённые Договора. Если там склад строк, то качать в БД конечно не надо. В нормальную БД делают импорт с валидацией. Мусорки там нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:53 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Petro123, Ну так автор же не расписал как и что сравнивать, от этого тоже может многое зависеть. Если там не только сравнение полей но и множеств (при условии множественных отношений) или иной сложный алгоритм сравнения, то тогда скорее всего сравнивать только по одной записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 12:53 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Blazkowiczpublexusсравнение одним запросом будет скорее всего на несколько порядков быстрее, чем вариант, предложенный Blazkowicz, потому что многочисленные одиночные сравнения строк(даже при использовании индексов) работают гораздо медленнее. С фига ли там несколько порядков нарисуются, если нужен полный скан, как базы так и XML? Выгрузка XML в базу, все выдуманные порядки до нуля сведёт. Исхожу из личного опыта, т.к. уже много лет занимаюсь оптимизацией запросов (правда на Oracle). если нужен полный скан, как базы так и XMLПолный скан будет по XML, а к базе для каждой записи XML будут однострочные запрос по индексу (как вы предлагали). А почему скорость будет отличаться на порядки, то попробуйте ради интереса перебрать всю большую таблицу с доступом через индексу и полное сканирование и поймете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 13:01 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly Dpublexus, думал и о вгрузке значений в базу данных, потом сделать дифф таблиц, но это сложно реализовывать. И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно... Загрузить однажды в базу и затем можно использовать SQL для сравнения (но это при условии что вы владеете XML). На уровне БД сравнение будет происходить гораздо быстрее, однозначно, нежели парсить XML и на ходу искать в базе. К тому при периодической необходимости при обновлении XML можно будет заливать только новые добавленные (или измененные) записи а не весь XML и сравнивать. А в случае варианта Blazkowicz вам придется снова обрабатывать весь XML. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 13:07 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Пардон, в предыдущем посте ошибся (но это при условии что вы хорошо владеете XML SQL) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 13:46 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAnatoly DПойду по пути как Вы описали, с той лишь разницей, что буду выкачивать из базы кусками, а не по одному. Для оптимизаций надо уже смотреть конкретно на структуры. Если база нормализована, то приходится ли некоторые записи ассоциаций выбирать несколько раз для базовой таблицы? Если, да, то их можно закешировать на уровне Java. Данные как-то упорядочены в XML? Если да, то, конечно, можно предварительно загрузить больше данных в память. Объем данных считали уже? Сколько весит XML? А БД? Можно базу с индексами целиком в памяти развернуть и свети IO к нулю. XML порядка 300 MB, но буду разбивать по несколько XML поменьше. А база 60 Гигов весит, развернуть-то можно, но не поймут меня. :) Сейчас попробую "в лоб" решить, посмотрим, нужно ли будет оптимизировать вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:05 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Petro123Anatoly Dpublexus, думал и о вгрузке значений в базу данных, потом сделать дифф таблиц, но это сложно реализовывать. И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно... непонятно что у вас за База. Обычно - это предметная область, а не хранилище строк. Там лежат только валидные данные. Нар. заключённые Договора. Если там склад строк, то качать в БД конечно не надо. В нормальную БД делают импорт с валидацией. Мусорки там нет. да с чего вы взяли что там хранилище строк-то? :) пример xml <record attr1="" attr2="" etc. attrN=""> и мапятся аттрибуты на разные таблицы, я не понимаю, почему я Вас не понимаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:07 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly DXML порядка 300 MB, но буду разбивать по несколько XML поменьше. Ну, его предварительно грузить в память смысла особого нет. Стримить парсером, даже разбивать не нужно. Anatoly DА база 60 Гигов весит, развернуть-то можно, но не поймут меня. :) Вроде было всего 1М записией в постановке задачи :) Anatoly DСейчас попробую "в лоб" решить, посмотрим, нужно ли будет оптимизировать вообще. Во-во. Правильное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:09 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
publexusAnatoly Dpublexus, думал и о вгрузке значений в базу данных, потом сделать дифф таблиц, но это сложно реализовывать. И прибыль от этого подхода довольно призрачна, ибо мы всё равно данные качаем, что из, и что в. А сравнить в коде 1 мильён и 1 мильён в базе разница будет не очень большой. наверно... Загрузить однажды в базу и затем можно использовать SQL для сравнения (но это при условии что вы владеете XML). На уровне БД сравнение будет происходить гораздо быстрее, однозначно, нежели парсить XML и на ходу искать в базе. К тому при периодической необходимости при обновлении XML можно будет заливать только новые добавленные (или измененные) записи а не весь XML и сравнивать. А в случае варианта Blazkowicz вам придется снова обрабатывать весь XML. XML - ежедневная сверка по сути. он будет одноразовым на один день. То бишь, прогнал сверку, всё сошлось - всем спасибо XML в архив и ждём следующего дня и следующую сверку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:10 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Anatoly DА база 60 Гигов весит, развернуть-то можно, но не поймут меня. :) Вроде было всего 1М записией в постановке задачи :) да там ваще много всего :) 1 мильён это для упрощенного описания. Так-то 1М - это ожидаемое количество новых добавлений в день. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:13 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly Dда с чего вы взяли что там хранилище строк-то? :) пример xml <record attr1="" attr2="" etc. attrN=""> и мапятся аттрибуты на разные таблицы, я не понимаю, почему я Вас не понимаю :) - потому что соединения таблиц идут через справочники и ID Если 2 таблицы ссылаются на таблицу городов 1000 строк, то такая структура не катит. - потому что уникальный ID либо невыгружают, либо сравнение идёт без их участия. Все ньюансы знаешь только ты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:20 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
ну, и если идти только от XML, то DELETE в БД - не отловить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 15:23 |
|
||
|
Сравнить 1 000 000 записей из файла с данными из базы
|
|||
|---|---|---|---|
|
#18+
Anatoly D, можно покопать в эту сторону: 1. сделать вьюху для данных в БД 2. сделать вьюху (запрос) к XML средствами БД 3. сравнение - тут несколько вариантов - в лоб (джоин, индексы) - использовать особенные возможности БД - сделать поле уникального хеша по всей строке данных и сравнивать только хеш ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2014, 19:17 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38578808&tid=2127553]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 489ms |

| 0 / 0 |
