Подтвердить что ты не робот

Должен ли я использовать Python или Assembly для супер быстрой программы копирования

Как проблема обслуживания, мне нужно регулярно (3-5 раз в год) копировать репозиторий, который теперь имеет более 20 миллионов файлов и превышает 1,5 терабайта в общем объеме дискового пространства. В настоящее время я использую RICHCOPY, но пробовал другие. RICHCOPY кажется самым быстрым, но я не верю, что приближаюсь к возможностям моей машины XP.

Я играю с использованием того, что я прочитал в The Art of Assembly Language, чтобы написать программу для копирования моих файлов. Моя другая мысль - начать учиться тому, как многопоточность в Python делать копии.

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

Любые наблюдения или опыт будут оценены. Заметьте, я не ищу никакого кода. Я уже написал базовую программу копирования в Python 2.6, которая не медленнее, чем RICHCOPY. Я ищу некоторые наблюдения, по которым мне будет больше скорости. Прямо сейчас мне требуется более 50 часов, чтобы сделать копию с диска на Drobo, а затем обратно с Drobo на диск. У меня есть LogicCube, когда я просто дублирую диск, но иногда мне нужно перейти с диска на Drobo или наоборот. Я думаю, что, учитывая, что я могу сектор копировать 3/4 полный 2 терабайт диск с использованием LogicCube менее чем через семь часов, я должен быть в состоянии приблизиться к этому с помощью Assembly, но я не знаю достаточно, чтобы узнать, действительно ли это, (Да, иногда невежество - это блаженство)

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

Спасибо за ранние ответы, но я не думаю, что это ограничения ввода-вывода. Я не перехожу через сеть, диск подключен к моей материнской плате с подключением sata, а мой Drobo подключен к порту Firewire, я думаю, что оба соединения должны обеспечивать более быструю передачу.

На самом деле я не могу использовать копию сектора, кроме перехода с одного диска на Drobo. Это не сработает иначе, поскольку файловая структура Drobo является загадкой. Мое ненаучное наблюдение заключается в том, что копия с одного внутреннего диска на другой не быстрее, чем копия на или из Drobo на внутренний диск.

Я связан аппаратным обеспечением, я не могу позволить себе 10 000 об/мин 2 терабайта (если они даже делают их).

Некоторые из вас предлагают решение для синхронизации файлов. Но это не решает мою проблему. Во-первых, решения синхронизации файлов, которые я сыграл, сначала создали карту (не имея лучшего термина) данных, у меня слишком много маленьких файлов, чтобы они задохнулись. Одной из причин, по которым я использую RICHCOPY, является то, что он начинает копировать немедленно, он не использует память для построения карты. Во-вторых, у меня было одно из моих трех резервных копий Drobo, которые выработали пару недель назад. Мое правило: если у меня есть резервный сбой, остальные два должны оставаться в стороне, пока не будет построен новый. Поэтому мне нужно скопировать одну из трех резервных копий одного диска, которые я использую с LogicCube.

В конце дня я должен иметь хорошую копию на одном диске, потому что это то, что я доставляю своим клиентам. Поскольку у моих клиентов есть разные системы, я доставляю их на диски SATA.

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

4b9b3361

Ответ 1

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

Вы упомянули о копировании в DROBO. Как ваш DROBO подключен? Проверьте этот график скорости соединения.

Посмотрите на максимальные скорости копирования, которые вы можете получить по определенным типам проводки:

  • USB = 97 дней (1.5 TB / 1.5 Mbps). Хромой, по крайней мере, ваша производительность не так уж плоха.
  • USB2.0 = ~ 7 часов (1.5 TB / 480 Mbps). Может быть, LogicCube?
  • Быстрый SCSI = ~ 40 часов (1.5 TB / 80 Mbps). Может быть, скорость вашего жесткого диска?
  • 100 Мбит/с Ethernet = 1,4 дня (1.5 TB / 100 Mbps).

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

Чтобы использовать dd, вы можете загрузить загрузочный linux на свой компьютер (или, возможно, использовать cygwin?). См. эта страница для справки или эта о резервном копировании из окон с помощью live -boot Ubuntu.

Если вы должны были организовать свои данные с 1,5 ТБ на RAID, возможно, вы могли бы ускорить копирование (потому что диски будут чтение в параллельном режиме), и (в зависимости от конфигурации) это будет иметь дополнительное преимущество для защиты от сбоев в работе накопителя.

Ответ 2

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

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

Ответ 3

Есть 2 места для замедления:

  • Копирование на один файл намного медленнее, чем копия диска (где вы буквально клонируете 100% данных каждого сектора). Особенно для файлов размером 20 мм. Вы не можете исправить это с самой настроенной сборкой, , если вы не переключитесь с клонирования файлов на клонирование необработанных данных на диске. В последнем случае, да, Ассамблея действительно является вашим билетом (или C).

  • Простое хранение 20-миллиметровых файлов и их рекурсивное обнаружение могут быть менее эффективными в Python. Но это скорее функция поиска лучшего алгоритма и вряд ли будет значительно улучшена Ассамблеей. Кроме того, это НЕ будет основным вкладчиком в 50 часов

В заключение - сборка поможет вам справиться с копией сектора raw disk, но не поможет, если вы выполните копирование на уровне файловой системы.

Ответ 4

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

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

Ответ 5

Я не верю, что это сделает заметную разницу в том, какой язык вы используете для этой цели. Узким местом здесь является не ваше приложение, а производительность диска.

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

Аналогично, когда вы делаете материал с коллекциями и другими библиотеками на Java, которые в основном скомпилированы C, не интерпретируются Java.

Есть несколько вещей, которые вы можете сделать, чтобы ускорить процесс.

  • Купите более быстрые жесткие диски (10 000 RPM, а не 7,5K или меньше латентности, большие кеши и т.д.).
  • Копирование между двумя физическими дисками может быть быстрее, чем копирование на одном диске (из-за движения головы).
  • Если вы копируете по сети, выполните ее. Другими словами, быстро скопируйте его на другой локальный диск, а затем медленно оттуда по сети.
  • Вы также можете настроить его по-другому. Если вы выполняете ночной (или даже еженедельный) процесс, чтобы обновлять копию (только копирование измененных файлов), а не три раза в год, вы не окажетесь в ситуации, когда вам нужно скопировать огромную сумму.
  • Также, если вы используете сеть, запустите ее в поле, где находится репозиторий. Вы не хотите копировать все данные с удаленного диска на другой компьютер, а затем обратно на еще один удаленный диск.

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

Возможно, вам лучше будет придерживаться вашего текущего решения. Я подозреваю, что специализированная программа копирования уже будет оптимизирована как можно больше, поскольку это то, что они делают.

Ответ 6

Нет никаких оснований писать программу копирования в сборке. Проблема заключается в том, что количество IO не связано с процессором. Кроме того, функция копирования в python уже написана экспертами на языке C, и вы больше не будете писать скорость самостоятельно в ассемблере.

Наконец, нить не поможет, особенно в python. Пойдите с помощью Twisted или просто используйте новый модуль многопроцессорности в Python 2.6 и запустить пул процессов для копирования. Спасите себя от мучений, выполняя задание.

Ответ 7

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

Одна вещь, которую вы могли бы сделать для увеличения ввода-вывода, - это отделить выборку от источника и сохранить до целевых частей. Предполагая, что источник и место назначения являются отдельными объектами, теоретически можно сократить вдвое количество времени для процесса. Но стандартные инструменты уже делают это?

Oh - и на Python и GIL - с выполнением I/O-привязки, GIL действительно не так уж плох от штрафа.

Ответ 8

RICHCOPY уже копирует файлы параллельно, и я ожидаю, что единственный способ победить его - это встать в постель с файловой системой, чтобы вы минимизировали дисковый ввод/вывод, особенно поиски. Я предлагаю вам попробовать ntfsclone, чтобы узнать, соответствует ли он вашим потребностям. Если это не так, моим следующим предложением было бы парализовать ntfsclone.

В любом случае работа с файловой системой на диске будет проще всего на C, а не на Python и, конечно же, не на сборке. Тем более, что вы можете начать использовать код C из проекта NTFS 3G. Этот код предназначен для обеспечения надежности и удобства переноса, а не для производительности, но, возможно, это самый простой способ начать работу.

Мое время достаточно ценно, что я пытаюсь понять, действительно ли я увижу значительное увеличение скорости копирования.

Нет. Или, точнее, при вашем нынешнем уровне мастерства системного программирования достижение значительных улучшений в скорости будет непомерно дорогостоящим. То, о чем вы просите, требует очень специализированного опыта. Хотя у меня уже есть опыт внедрения файловых систем (гораздо проще, чем NTFS, XFS или ext2), я бы не стал заниматься этой работой; Я бы нанял это.


Сноска: если у вас есть доступ к ящику Linux, узнайте, какую пропускную способность для записи можно получить на целевом диске:

time dd if=/dev/zero of=/dev/sdc bs=1024k count=100

предоставит вам время для записи 100 МБ последовательно самым быстрым способом. Это даст вам абсолютное ограничение на то, что возможно с вашим оборудованием. Не пробуйте это, не понимая справочную страницу для dd! dd означает "уничтожить данные". (На самом деле это означает "копировать и конвертировать", но был сделан cc.)

Программист Windows, вероятно, может указать вам эквивалентный тест для Windows.

Ответ 9

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

Переход на более низкий уровень не означает, что вы получите лучшую производительность. Возьмем простой пример API-интерфейсов open() и fopen(), где open гораздо более низкий уровень, является более прямым и fopen() является библиотечной оболочкой для функции open() системы.

Но на самом деле fopen имеет лучший уровень производительности, поскольку он добавляет буферизацию и оптимизирует множество вещей, которые не выполняются в функции raw open().

Реализация оптимизации на уровне сборки намного сложнее и менее эффективна, чем в python.

Ответ 10

1,5 ТБ примерно через 50 часов дает пропускную способность (1,5 * 1024 ^ 2) МБ /(50 * 60 ^ 2) s = 8,7 МБ/с. Теоретическая пропускная способность 100 мбит/с должна давать вам 12,5 МБ/с. Мне кажется, что ваша связь с firewire является проблемой. Вы должны посмотреть обновление драйверов или обновление до лучшего интерфейса firewire/esata/usb.

Тем не менее, а не вопрос python/assembly, вы должны посмотреть на получение решения синхронизации файлов. Не обязательно копировать эти данные снова и снова.

Ответ 11

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

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

Ответ 12

Так как я опубликовал вопрос, который я играл с некоторыми вещами, и я думаю, что сначала, а не быть аргументированным, но те из вас, кто отправил ответ, который я связан с i/o, являются лишь частично правильными. Это время поиска, которое является ограничением. Длинная история для тестирования различных вариантов. Я построил новую машину с процессором I-7 и достаточно мощную/функциональную материнскую плату, а затем использовал те же два диска, с которыми я работал, прежде чем заметил довольно значительное увеличение скорости. Я также отметил, что когда я перемещаю большие файлы (один гигабайт или около того), я получаю устойчивые скорости передачи более 50 мб/с, и скорость значительно уменьшается при перемещении небольших файлов. Я думаю, что разница в скорости происходит из-за неупорядоченного диска относительно того, как программа копирования считывает структуру каталогов, чтобы определить файлы для копирования.

Я думаю, что нужно сделать, чтобы 1: Прочитайте MFT и отсортируйте по секторам, работающим извне во внутреннюю часть пластинки  (это означает, что я должен выяснить, как работают диски с несколькими дисками) 2: Анализ и разделение всех непрерывных и несмежных файлов. Я бы справился с  смежных файлов и вернуться назад для обработки несмежных файлов 3: начните копирование смежных файлов извне внутрь 4. Когда закончите копировать несмежные файлы, по умолчанию они окажутся на внутренней  кольца пластин (ов), и они будут смежными. (Хочу отметить, что я  регулярно дефрагментировать и иметь менее 1% моих файлов/каталогов фрагментированы), но  1% из 20 миллионов все еще 200K

Почему это лучше, чем просто запуск программы копирования.

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

  • Проблема с копией сектора заключается в том, что она ничего не исправляет, и поэтому, когда я перехожу к размерам диска и добавляю данные, я получаю новые проблемы для обработки.

  • Если я сделаю это правильно, я смогу проверить заголовки файлов и учетную запись eof и выполнить некоторую работу. CHKDSK - отличная программа, но вроде немой. Когда я получаю повреждение файлов/папок, действительно сложно определить, что было потеряно, создав мою собственную программу копирования, я мог бы включить цикл обслуживания, который мог бы вызвать, когда я хочу запустить некоторые тесты на файлы во время копирования. Это может замедлить некоторые из них, но я не очень-то думаю, потому что процессор будет перемещать файлы намного быстрее, чем их можно вытащить или записать. И даже если он замедляет его при запуске, по крайней мере, я получаю некоторый контроль (возможно, понимание лучшее слово) проблем, которые неизбежно возникнут в несовершенном мире.

Мне, возможно, не нужно делать это в A, я искал способы играть (читать) MFT и есть даже инструменты Python для этого см. http://www.integriography.com

Ответ 13

Ни. Если вы хотите использовать функции ОС для ускорения ввода-вывода, вам нужно будет использовать некоторые специализированные системные вызовы, которые наиболее легко доступны на C (или С++). Вам не нужно знать много C, чтобы написать такую ​​программу, но вам действительно нужно знать интерфейсы системных вызовов.

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