1

我正在使用 Ruby 官方 Ruby C 接口,但无法进行 bzip 工作。它确实在 bzip 支持下构建,./configure 说:

checking bzlib.h usability... yes
checking bzlib.h presence... yes
checking for bzlib.h... yes

所以我编写了这个示例程序,它只向两个文件写入一个条目,一个应该是 bzip'd,一个不是。两者都没有被压缩;除了最后的简单文件大小测试之外,我还可以编辑 with_bzip.tcb 文件并在那里查看原始字符串文本。

require 'tokyocabinet'
include TokyoCabinet

def write filename, options
  File.unlink filename if File.exists? filename
  bdb = BDB::new
  bdb.tune(0, 0, 0, -1 -1, options) or raise "Couldn't tune"
  bdb.open(filename, BDB::OWRITER | BDB::OCREAT | BDB::OLCKNB) or raise "Couldn't open"
  bdb["test"] = "This string should be compressed and not appear raw.\n" * 10000
  bdb.close
end

write 'without_bzip.tcb', 0
write 'with_bzip.tcb', BDB::TBZIP
puts "Not actually compressed" unless File.size('with_bzip.tcb') < File.size('without_bzip.tcb')

更糟糕的是,如果我尝试使用 Oklahoma Mixer 的预览版(以下示例 - 尽管我没有添加新标签的声誉),它的压缩效果很好。当我在它的 try() 调用中加入一些调试时,它似乎正在对 tune(0, 0, 0, -1, -1, 4) 进行相同的调用。我完全被难住了——谁能告诉我我上面的代码做错了什么?

require 'oklahoma_mixer'
OklahomaMixer.open("minimal_om.tcb", :opts => 'lb') do |db|
  db["test"] = "This string should be compressed and not appear raw.\n" * 10000
end 
4

1 回答 1

1

这是一个邪恶的、微妙的错误。我在 tune() 调用中省略了一个逗号,并写了 -1 -1 而不是 -1, -1。所有参数都是可选的,所以它不会安静地进行 bzip 压缩。啊。

于 2010-03-05T17:47:30.893 回答