Двоичный поиск или ВТКЕЕ вопрос обновления индекса

голоса
4

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

Ваша задача заключается в выявлении изменений и дополнений, а также передать только они наряду с издателем (кто не имеет времени, чтобы прочитать всю книгу каждый день)

Для целей этой задачи, книга состоит из 1 млн строк текстовых и растут (на самом деле резервное копирование файлов MySQL).

Моя текущая идея заключается в том, чтобы сделать безопасный хэш (SHA256, например) каждой строки (1k символов) и сохранить его на HD. Поскольку хэш только 32 байта файла только 32 МБ.

Тогда, когда мы получаем следующий файл завтра, мы проходим построчно, создавая новый хэш для каждой строки и сравнивая его с хэш от предыдущего дня.

Когда процесс будет завершен, мы перезаписать хэш-файл готов на следующий день.

Сравнение использует двоичный метод поиска строки сравнения (> <операндов) Это возвращает результат в среднем четырех итераций.

Я не закодирован индекс ВТКЕЯ решения пока нет, но как бы вы решить это?

Задан 30/10/2008 в 01:52
источник пользователем
На других языках...                            


6 ответов

голоса
1

Я хотел бы использовать диф .

Если мне нужно было реализовать в рамках своей собственной программы, я хотел бы использовать один из алгоритмов для нахождения наибольшей общей подпоследовательности двух последовательностей, рассматривая каждый файл в виде последовательности строк.

Ответил 30/10/2008 в 01:58
источник пользователем

голоса
0

«Тогда, когда мы получаем следующий файл завтра, мы проходим построчно, создавая новый хэш для каждой строки и сравнивая его с хэш от предыдущего дня.»

Понял: 1m линии сегодняшних хэш-значений по сравнению с 1 млн строк вчерашних значений.

Есть линии вставляются или удалены? Если нет, то это просто набор параллельно читает, чтобы увидеть, если хэши разные.

Если есть добавляет или абсорбцию, вы должны будете использовать алгоритм сравнения для определения сферы изменения.

Все это прекрасно. Не слишком сложно реализовать.

В этом контексте, следующий не имеет никакого смысла.

Сравнение использует двоичный метод поиска строки сравнения (> <операндов) Это возвращает результат в среднем четырех итераций.

Есть ли какой-то заказ на хеш-значения? Или какая-то структура дерева?

Ответил 30/10/2008 в 02:20
источник пользователем

голоса
0

Книга 1 миллиона строк огромен: есть, возможно, 30 - 50 строк на странице, так что давайте быть щедрым и предположим, 100 строк на странице, что означает 10000 страниц в книге.

Линии 1 КБ также гораздо больше, чем в норме; Основная читаемость предполагает далеко, что многие символы в строке. Намерены ли вы хэш строки до 1 Кбайт или фрагмента файла, в 1 Кб кусков? Одна из проблем, с вашей схемы является то, что любые повторяющиеся строки будут иметь повторное хэш; Вы никогда не могли определить, когда одна из этих линий были добавлены или удалены.

Вы бы, по-видимому, необходимо уведомить издатель удаленных строк тоже.

Как Glomek, я хотел бы использовать diffв файле. Если вы сохраняете файл в RCS или CVS контроля, вы бы только текущую версию файла и изменений между предыдущими версиями сохранены. При этом, вы бы быть в состоянии предоставить кумулятивные более в посмотреть различия неделю или месяц тоже.

И я, вероятно, не будет развивать свою собственную индексацию B-Tree.

Ответил 30/10/2008 в 02:23
источник пользователем

голоса
0

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

если ваши файлы действительно RECORD-структурированы, вы можете упростить немного, как вы предлагаете. если нет, то вам нужна качения контрольной суммы.

Кроме того, вы должны признать, переста-? или только вставки / делеция / замены?

наиболее общий случай полного Rsync алгоритм, который выглядит следующим образом:

  • Определение параметров:

    1. выбрать размер блока 512, или 1k обычно работают нормально.
      • выбрать «сильную» контрольную сумму. что-то вроде от MD4 или так. 64бит много.
      • выбрать «слабой» качения контрольной суммы. тот, который позволяет «вычесть» хвост байт и «добавить» голова байт, чтобы получить контрольную сумму блока 1 байта вперед. как правило, 16-битная контрольная сумма работает нормально.
  • подпись старого файла:

    1. траверс всего старого файла, в каждом блоке вычисление как слабые и сильные контрольных сумм. с 16 и 64 битыми контрольными суммами и 512 байт блоков, что означает 10bytes на блок, или 20kb за мегабайт. это «подпись»
  • создать «патч» с новым файлом, и подпись старого файла:

    1. загрузит подпись старого файла, лучшим является хэш-таблица, со слабыми контрольных сумм в качестве ключей, сильные контрольные суммы и положение блока являются значения.
      • прочитал первый блок нового файла
      • вычислить слабую контрольную сумму загруженного блока
      • проверить хэш-таблицу, чтобы увидеть, если слабая контрольная сумма есть.
      • если обнаружено, вычислить сильную контрольную сумму и сравнить с найденным в хэш
      • если совпадают обе контрольные суммы, пометить как «получил его» со ссылкой блока в хэш, заранее одно целое и размер блока вернуться к шагу 3
      • если сильная контрольная сумма не совпадает, или если слабая контрольная сумма не была в хэше-ролл "слабые контрольных суммы, то есть,«добавить»следующие байты после блока, и«вычитать»первые байты из хвост.
      • добавить байт «вычтено» из хвоста списка «новых» байтов в пластыре
      • вернуться к шагу 4
  • применить патч к старому файлу

    1. «патч» список «новых» байты, которые высадили при прокатке контрольной суммы, плюс список «получил его» блоки, которые соответствуют старому файлу.
Ответил 30/10/2008 в 02:34
источник пользователем

голоса
0

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

Вам нужен алгоритм хеширования с очень широким ключом , как этот подход уязвим к атакам на день рождения . MD5 или любой из семейства SHA будет хорошо. Он также не может обнаружить делеции без пост-процесс , который проходит через разницу в поисках пропавших без вести естественные ключи. Это вычисление на самом деле нужно , чтобы быть в курсе структуры таблицы.

Ответил 30/10/2008 в 09:44
источник пользователем

голоса
0

Одна из проблем, с вашей схемы является то, что любые повторяющиеся строки будут иметь повторное хэш; Вы никогда не могли определить, когда одна из этих линий были добавлены или удалены

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

«Дифф» ссылка берет меня на страницу с описанием того, что я предполагаю, что это приложение? Там нет ссылки на скачивание, нет кода на любом языке ... Что я здесь отсутствует?

Некоторые из вас говорили о уровне байт зернистости. Это не требуется. только линейный уровень детализации требуется, потому что если что-то на линии была изменена, вся строка (запись) должна быть переработана еще потому любое изменение в линии влияет на всю линию.

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

Таким образом, используя безопасный хэш как SHA256 (MD5 имеет коллизии и медленно по сравнению), я могу обработать около 30МБ / сек на моем ноутбуке HO. Сервер, конечно, будет жевать через него намного быстрее.

Таким образом, если файл arond 1 Гб, то делает все hases занимает около 33sec, и чтение файла 1Gb с помощью страницы памяти окна занимает около 30 секунд. Не ужасающий

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

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

Предложения чтения ПРЕДИСЛОВИЕ постранично хорошо, но предполагается, что оба файла находятся в smae порядке до недо первого изменения. Это не может быть принято считать. Линии (строки), могут быть в любом порядке. Кроме того, выбирая произвольный размер блока нарушает зернистость линии. Для целей этой задачи, строки являются неизменяемыми.

Из этой отличной ссылки на invrementa загрузки: Файл сравнения Capture: Этот метод также известен как снимок дифференциального метода. Этот метод работает, сохраняя до и после изображений файлов, представляющих интерес для хранилищ данных. Записи сравниваются, чтобы найти изменения и записи ключей сравниваются, чтобы найти вставки и удаления. Этот метод является наиболее подходящим в случае унаследованных систем в связи с тем, что вызывает, как правило, не существует и журналы транзакций либо не существует, либо в собственном формате. Поскольку большинство устаревших баз данных имеют некоторый механизм для сброса данных в файлы, этот метод создает периодические снимки, а затем сравнивает результаты производить записи изменений. Конечно, все проблемы статического захвата присутствуют здесь. Добавлена ​​сложность вводится вызов сравнения целых строк информации и идентификации ключа и согласования. Этот метод носит сложный характер и, как правило, не желательно, но, в некоторых случаях, может быть единственным решением.

Это имеет самое непосредственное отношение здесь: Как мы переходим в область складов терабайт данных, возможность восстановления хранилища данных с нуля по ночам будет идти по пути динозавров. Логичный и эффективный подход к обновлению хранилища данных включает в себя некоторую форму дополнительных стратегии обновления.

Таким образом, я предполагаю, что я нахожусь на правильном пути тогда? Индекс ВТКЕЕ не дало бы преимущество?

Ответил 31/10/2008 в 08:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more