проблема скорости дд с использованием ibs / obs - PullRequest
1 голос
/ 27 июня 2011

У меня есть цикл, в котором я использую dd для копирования потока на диск. Я использую больший размер блока, используя 'bs' во всем процессе по соображениям скорости. Однако с одной конкретной строкой я должен использовать «ibs» и «obs», потому что мое местоположение «seek» не кратно «bs», которое я использую в другом месте.

Мой вопрос: есть ли способ использовать dd или любой другой программный / Perl-модуль для записи размера блока, отличного от того, который использовался для поиска?

dd if=/dev/ram1 of=/dev/sdb1 seek=2469396480 ibs=1048576 obs=1 count=1

Как вы можете видеть выше, в то время как необработанные данные читаются в блоке 1M, я должен записать их в сегментах по 1 байт, потому что мне нужно искать в определенном месте на основе гранулярности байтов. Это делает запись на 1/100 быстрее.

Есть ли обходной путь? Или есть способ сделать это в Perl без использования dd?

Спасибо

Ник

1 Ответ

0 голосов
/ 05 января 2012

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

В этом конкретном случае, как указывало Марк Манн , у вас до есть хорошие варианты:2469396480 - это 2355 блоков размером 1048576 или 1024 блока размером 2411520 и т. Д. Но это не общий ответ.

Чтобы сделать это в общем, вам нужно использовать что-то отличное от dd.К счастью, задача dd очень проста, и все, что вам нужно, это следующее (в псевдокоде ... Я не очень много делал на Perl)

if = open("/dev/ram1", "r")
of = open("/dev/sdb1", "r+")
seek(of, 2469396480)
loop until you have copied the amount of data you want {
    chunk = read(if, min(chunksize, remaining_bytes_to_copy))
    write(of, chunk)
}

Похоже, источникВаша копия - это некий виртуальный диск.Если вам действительно нужна кричащая производительность, вы можете попробовать другой метод, кроме чтения фрагментов в буфер и записи буфера в выходной файл.Например, вы можете mmap() исходный файл и write() непосредственно с сопоставленного адреса.ОС может (или не может) оптимизировать одну из операций копирования из ОЗУ в ОЗУ.Обратите внимание, что такие методы будут менее переносимы и с меньшей вероятностью будут доступны на языках высокого уровня, таких как Perl.

...