提问人:alec 提问时间:11/15/2020 最后编辑:alec 更新时间:11/15/2020 访问量:126
附加到CSV文件,我可以使用seek来确定是否应该写入标题吗?有更好的方法吗?
Appending to CSV file, can I use seek to determine if header should be written? Is there a better way?
问:
我必须生成一些 CSV 文件并将它们写入磁盘。不幸的是,我一次只能得到一行文件。 我必须每秒进行大量写入,所以我希望我的程序尽可能高效(尽量减少磁盘操作)
我目前有以下 ruby 代码来构建 csv:
def add_line(doc)
File.open("myfile.csv", "a") do |f|
f.seek(0, IO::SEEK_END) # Move cursor to end of file (is this costly?)
f.write(doc.keys.join(",") + "\n") if f.pos() == 0 # Write header if cursor position is 0
f.write(doc.values.join(",") + "\n") # Write CSV line
end
end
# Write line to file
add_line({
key1: "value1",
key2: "value2",
key3: "value3"
})
确定是否应该写入标头的最有效方法是什么?我可以先检查文件的大小,如果它是 0,则写标题。
使用效率更高吗?
有没有更好的方法来实现这一目标?seek
有关用例的更多背景信息: 我正在将这些 CSV 文件写入 Ceph 卷(分布式文件系统),并且我正在尝试尽可能地减少文件系统的压力(因为这些写入量将非常大)
我希望 ruby 可以在以追加模式打开时指示是否必须创建文件,因为它可以使我不必进行这种额外的检查。
谢谢!
答: 暂无答案
评论
"a"
strace
seek
pos
lseek
fstat
f.size
IO#seek
IO#sysseek
<write headers> if f.sysseek(0, IO::SEEK_END) == 0
lseek