1

我有一个循环,我使用 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。

有解决方法吗?或者有没有办法在不使用 dd 的情况下在 Perl 中做到这一点?

谢谢,

缺口

4

1 回答 1

0

这个问题是固有的dd。如果您想要的搜索位置没有合适大小的因素(足够大以获得良好的性能,但足够小以用作缓冲区大小),那么您就被卡住了。当您想要的搜索位置是一个大素数时,就会发生这种情况。

在这种特定情况下,正如Mark Mann指出的那样,您确实有很好的选择: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)
}

看起来您的副本的来源是某种 ramdisk。如果你真的想要尖叫的性能,除了将块读入缓冲区并将缓冲区写入输出文件之外,你可以尝试另一种方法。例如你可以直接从mmap()源文件write()中映射地址。操作系统可能(或可能不会)优化掉 RAM 到 RAM 复制操作之一。请注意,此类方法的可移植性较差,并且不太可能在 Perl 等高级语言中可用。

于 2012-01-05T17:51:55.410 回答