我正在使用 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