Узкие места Python; Определение оптимального размера чанка для функции сравнения файлов - PullRequest
2 голосов
/ 02 ноября 2011

Я пишу функцию сравнения файлов. Я знаю filecmp.cmp, но в моем наборе данных ожидается, что многие файлы будут одинаковыми, поэтому я подумал, что вместо того, чтобы сравнивать каждое потенциальное совпадение друг с другом, было бы лучше реализовать многофайловое сравнение, которое может сравнивать их все сразу. (Кроме того, так как я новичок в python, я подумал, что это хорошее упражнение в обучении.) Кажется, это будет хорошо. до сих пор, на самом деле, с некоторыми входами это быстрее, чем Unix cmp (что на самом деле меня немного беспокоит, потому что я не совсем верю, что это возможно, и поэтому думаю, что, возможно, что-то не так с моей реализацией!)

Итак, у меня написан код, но сейчас я пытаюсь определить, какой будет идеальный размер куска для каждого чтения. Часть меня думает, что все полученные данные нужно будет сравнивать в любом случае, поэтому, чем больше я могу получить в памяти за один раз, тем лучше, но мне интересно, есть ли ограничения структур данных Python, которые могут повлиять на это. Например, я веду, потенциально большие списки чанков, и использую словари, где ключами являются чанки чтения.

Итак, что я должен знать во встроенных структурах данных python, которые могут повлиять на это, или это то, что будет определяться только аппаратными средствами и должно определяться профилированием на конкретной машине?


Читая это в ответ, я понимаю, что это не самый ясный вопрос, но (несмотря на попытки) я не уверен, как это уточнить. Я с удовольствием выложу свой код, если это прояснит ситуацию, но он немного длиннее, чем ваш средний пример кода (хотя и не так уж плохо). Пожалуйста, прокомментируйте, если необходимы дальнейшие разъяснения.

Спасибо.


Обновление Re. SHA1: Я проверил свой алгоритм против SHA1 только на 2 одинаковых входных файлах (больше ожидаемых в реальных данных), которые выполняются каждые 100 раз. Я понимаю, что это не тщательный тест, но результаты достаточно разные, чтобы его стоило комментировать.

(Компьютер не подвергался какой-либо другой нагрузке во время любого теста, и, несмотря на то, что я сказал в комментариях, он не работал на целевой машине, он работал на одной с вполне разумными характеристиками. Оба Тесты потенциально могли выполняться в двух потоках, то есть SHA1 происходил в двух потоках, и два потока были запущены для моего, но из-за реализации использовался бы только один. Однопоточная версия SHA1 заняла намного больше времени. Оба теста прочитали один и тот же размер фрагмента за раз. Даны три набора результатов.)

Теперь я в замешательстве. Правильны ли комментарии (ре. SHA1)? Следовательно, это свидетельствует о неправильной реализации или что-то еще происходит?

SHA1:

real    5m35.865s    6m17.737s    5m57.010s
user    10m18.963s   11m34.178s   10m58.760s
sys     0m47.030s    0m52.707s    0m47.807s

Mine:

real    3m47.185s    4m31.548s    4m40.628s
user    2m47.849s    3m26.207s    3m36.013s
sys     0m59.193s    1m5.139s     1m4.406s

1 Ответ

3 голосов
/ 02 ноября 2011

Я предлагаю вам использовать методологию двоичного поиска для выбора значения размера.

Начните с большого значения (которое, как вы знаете, слишком большое) и уменьшите его вдвое. Если это быстрее, уменьшите его вдвое Если это медленнее, переходите к следующему половинному интервалу. Продолжайте, пока не достигнете лучшего значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...