【问题标题】:TokyoCabinet's Ruby C interface can't bzipTokyoCabinet 的 Ruby C 接口无法 bzip
【发布时间】:2011-01-23 21:03:36
【问题描述】:

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

【问题讨论】:

    标签: ruby tokyo-cabinet bzip


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2013-08-10
      • 2013-09-15
      • 2017-01-24
      • 2020-12-24
      相关资源
      最近更新 更多