|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Привет всем. Есть большой файл, например, 20Гб (я хочу залить его на сервак). Я бью этот файл на 10 равных блоков, соответственно, по 2Гб (10ый может получиться чуть меньше) и заливаю каждый блок по отдельности, храня только блоки. Далее я меняю файл, скажем, почти в самом начале и изменил во втором блоке 2 Гб на другие 3 Гб. Тогда, чтобы не заливать 3-10 блоки заново, я могу побайтно пройтись (каждый раз сравнивая хэш очередных 2Гб и 2Гб на сервере) и найти начало 3 неизменного блока. ВОПРОС: есть ли более оптимальный алгоритм для моей задачи, чем ходить побайтно? Если, например, изменится 5-10% файла, то алгоритм выглядит неплохо (т.к. 90-95% уже хранится на сервере и не нужно заливать их), но если изменится 80%-90%, то быстрее будет не искать побайтно одинаковые блоки, а залить все блоки на сервер заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:19 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Students, Да. Блоки по 2 МБ. + Md5 хэш каждого блока. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:40 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Arm79Students, Да. Блоки по 2 МБ. + Md5 хэш каждого блока. грубо говоря так и есть (я просто для вопроса упростил). проблема в том, что если в файле на 20Гб изменилось АБСОЛЮТНО ВСЁ , т.е. файл стал другим (название только сохранилось), то мы будем 20Гб ходить побайтно и искать Md5 хэш каждого блока , т.е. алгоритм становится совсем неоптимальным . с другой стороны, если к файлу добавился с самого начала только 1 байт, то этот алгоритм будет очень хорош . мы зальем только этот 1 байт, а остальные все блоки по 2 МБ уже на сервере есть ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:45 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
может какой-то другой алгоритм есть, кроме "побайтного перебора"? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:46 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Конечно есть. Если стоит задача поменять все блоки, то проще создать новый файл, а старый грохнуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:52 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Arm79Конечно есть. Если стоит задача поменять все блоки, то проще создать новый файл, а старый грохнуть.человек о другом спрашивает. КАК УЗНАТЬ, что нужно поменять все блоки? А как именно вносятся изменения в исходный файл? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:55 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Arm79проще создать новый файл, а старый грохнуть. не проще. если файл 20 Гб и если к файлу добавился с самого начала только 1 байт, то этот алгоритм будет очень хорош. мы зальем только этот 1 байт, а остальные все блоки по 2 МБ уже на сервере есть. проще только если вообще 100% поменялось у файла, но мы же заранее не знаем, так? поэтому я и спрашиваю, есть ли более быстрые алгоритмы. вполне возможно, что есть и тут кто-то знает ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 16:57 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Students, почитай про алгоритм утитилиты rsync . Там ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:01 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
например, алгоритм сортировки Хоара значительно быстрее, чем пузырьком. Возможно, для моей задачи, тоже есть другой алгоритм, а не обычный побайтный перебор. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:02 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:02 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Students, что для вас критерий оптимальности и чем в угоду этому вы готовы жертвовать? Экономите сетевой трафик? - ищите по словам deduplication algorithm Хотите распараллелить закачку? - ищите по словам sparse file ну и т.п. и т.д. P.S.: ну и вообще это не такая уж и тривиальная задача... а казалось бы... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:02 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
buserP.S.: ну и вообще это не такая уж и тривиальная задача... а казалось бы... так и я о том же, просто если алгоритмы сортировки массива нагуглить можно очень быстро, то алгоритмы для моей задачи нагуглить не так просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:04 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
bazile, случайно отправил предыдущее сообщение не закончив его. Если речь идет о файле который меняет другой процесс, то нам в любом случае придется пробежаться по всему файлу в поисках изменений. Соответственно вопрос в выборе оптимального алгоритма поиска блоков и определения что именно нужно передавать. Алгоритм rsync в этом плане оптимален. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:04 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
bazilebazile, случайно отправил предыдущее сообщение не закончив его. Если речь идет о файле который меняет другой процесс, то нам в любом случае придется пробежаться по всему файлу в поисках изменений. Соответственно вопрос в выборе оптимального алгоритма поиска блоков и определения что именно нужно передавать. Алгоритм rsync в этом плане оптимален. Хорошо, спасибо. Вот ссылка на русском языке, может кому понадобится. http://citforum.ru/nets/articles/rsync/ ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:09 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Studentsпроще только если вообще 100% поменялось у файла, но мы же заранее не знаем, так? поэтому я и спрашиваю, есть ли более быстрые алгоритмы. вполне возможно, что есть и тут кто-то знает rsync и есть разбиение поблочно и обмен хешами. алгоритм простой - если у вас файл разбит на блоки и от каждого блока есть хеш, то в новом файле достаточно также разбить на блоки и сравнивать хэши. Необходимости в обоих файлах побайтно сравнивать нет. Варианты оптимизации есть, если файлы текстовые или тем или иным способом структурированные (например, вставка одного символа в середину). Но ваш случай кажется не такой. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:20 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
buserStudents, что для вас критерий оптимальности и чем в угоду этому вы готовы жертвовать? Экономите сетевой трафик? - ищите по словам deduplication algorithm Хотите распараллелить закачку? - ищите по словам sparse file ну и т.п. и т.д. Хочу не заливать абсолютно одинаковые 2Мб блоки на сервер каждый раз. Если пользователь жмет "сохранить на сервер" уже сохраненный фильм, никакого смысла перезаписывать одинаковые блоки нет. И экономим время, и экономим сетевой трафик пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:22 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
отсюда http://citforum.ru/nets/articles/rsync/ : Код: plaintext
т.е. опять побайтное смещение . теперь представьте, что файл - трёхчасовой фильм MKV 1080 на 30Гб , сколько времени и ресурсов нужно, чтобы побайтно пройтись по такому файлу и для каждого смещения подсчитать хэш и ссравнить с хэшем на сервере ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:44 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Arm79rsync и есть разбиение поблочно и обмен хешами. алгоритм простой - если у вас файл разбит на блоки и от каждого блока есть хеш, то в новом файле достаточно также разбить на блоки и сравнивать хэши. Необходимости в обоих файлах побайтно сравнивать нет. Варианты оптимизации есть, если файлы текстовые или тем или иным способом структурированные (например, вставка одного символа в середину). 1)алгоритм rsync не подходит, т.к. побайтно смещаться, каждый раз считая хэш и сравнивая эти 2 Мбайтные блоки с серверными для 30 Гб для MKV фильма БЕЗУМИЕ 2)да, это просто. а вот если мы спереди к файлу приклеили 1 байт, то тогда будет смещение на 1 байт и все хэши будут другими, в этом случае побайтный проход по 1 байту будет очень кстати 3)файлы произвольные ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 17:52 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Students, ты сначала реализуй алгоритм посчета "быстрой сигнатары" и только после этого делай выводы насколько это эффективно. Для сравнения двух произвольных файлов в любом случае требуется пробежать по обоим файлам от начала до конца. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 19:01 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
Students2)да, это просто. а вот если мы спереди к файлу приклеили 1 байт, то тогда будет смещение на 1 байт и все хэши будут другими, в этом случае побайтный проход по 1 байту будет очень кстати так доработай. блоки по N байт, но пиши в них M байт, причем M < N. Тогда будет некоторый запас по байтам... Или, у тебя есть файл разбитый по блокам. Ты знаешь, что первый блок дополнен одним байтом. тогда команду серверу на добавление этого блока и пересчет хэшей. Два подхода можно совместить. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 19:52 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
а скорость - MemoryMappedFiles тебе в помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 19:53 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
rsync тут по делу предлагают. Фишка в нем в том, там используются две хэш-функции. Быстрая нужна для примерного сравнения, а нормальная криптографическая -- для точного. Из альтернатив можешь посмотреть на zsync . ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 21:33 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
StudentsArm79rsync и есть разбиение поблочно и обмен хешами. алгоритм простой - если у вас файл разбит на блоки и от каждого блока есть хеш, то в новом файле достаточно также разбить на блоки и сравнивать хэши. Необходимости в обоих файлах побайтно сравнивать нет. Варианты оптимизации есть, если файлы текстовые или тем или иным способом структурированные (например, вставка одного символа в середину). 1)алгоритм rsync не подходит, т.к. побайтно смещаться, каждый раз считая хэш и сравнивая эти 2 Мбайтные блоки с серверными для 30 Гб для MKV фильма БЕЗУМИЕ 2)да, это просто. а вот если мы спереди к файлу приклеили 1 байт, то тогда будет смещение на 1 байт и все хэши будут другими, в этом случае побайтный проход по 1 байту будет очень кстати 3)файлы произвольные А тут у меня такой наивный вопрос, а как ты узнаешь что у тебя файл вырос на один байт, и как ты узнаешь, что он вырос в начале а не в середине скажем. IMO Автор, начни всё с начала. Бредовая идея не заслуживает обсуждения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2014, 23:23 |
|
Интересный вопрос на оптимальный алгоритм
|
|||
---|---|---|---|
#18+
алгоритм есть здесь http://en.wikipedia.org/wiki/Longest_common_subsequence_problem Кто-нибудь знает, как он по-русски называется? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2014, 12:44 |
|
|
start [/forum/topic.php?fid=20&msg=38612700&tid=1403041]: |
0ms |
get settings: |
12ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 173ms |
0 / 0 |