繁体   English   中英

写入预分配文件的特定部分

[英]Write to specific part of preallocated file

我目前正在尝试写入预分配文件的不同位置。

我首先这样分配文件:

File.open("file", "wb") { |file| file.truncate(size) }

大小是文件的总大小。

之后,我接收到适合该文件Y位置的XX大小的数据。 请记住,这部分过程是分叉的。 每个fork都有自己的唯一套接字,并打开自己的唯一文件句柄,写入文件,然后关闭文件。

data = socket.read(256)

File.open("file", "wb") do |output|
   output.seek(location * 256, IO::SEEK_SET)
   output.write(data)
end

反过来,这应该允许派生的进程打开文件句柄,查找到正确的位置(如果location为2且data_size为256,则写入位置为512-> 768)并写入接收到的数据块。

尽管这是我无法理解的。 我正在监视正在填充的文件大小,并且它正在从不应更改的不同文件大小中反弹。

使用十六进制编辑器分析文件时,文件数据标头应位于顶部的空字节填充(就像明智的那样,使用文件的1/4)。 尽管如果我限制分叉的进程只写1个文件块然后退出,则写操作很好并且位于正确的位置。

我还做了其他一些测试,例如转储零件位置,数据的起始位置以及寻找文件正确位置的方程式似乎也是正确的。

我在这里缺少什么吗?还是有另一种方法让多个线程/进程打开文件的文件句柄,查找到特定的位置,然后写入大量数据?

我还尝试在文件上使用FLOCK,它产生相同的结果,同样使用主进程而不是派生。


我已经测试了相同的应用程序,但是不是每次需要快速连续写入数据(传输速度接近70mb / s)时都打开/关闭文件句柄,而是为每个派生进程创建了一个文件句柄并将其保持打开状态。 这解决了导致具有匹配校验和的文件以1:1复制的问题。

所以问题是,为什么快速连续打开/写入/关闭文件句柄会导致这种现象?

这是您的文件模式。

File.open("file", "wb")

“ wb”表示“打开时,将文件截短为零长度”。

我建议使用“ r + b”,这意味着“阅读和写作,不能截断”。 在此处详细了解可用模式: http//ruby-doc.org/core-2.2.2/IO.html#method-c-new

顺便说一句,在那些模式下,“ b”表示“二进制”(与默认的“ t”(文本)相对)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM