Ruby问题:筛选数字开头赛事推文后文件大小未更新
Ruby写入文件后内容正常但大小未更新的解决办法
嘿,这个问题我之前做实时日志采集的时候碰过好几次!核心原因就是Ruby的文件IO缓冲机制在搞事情——你写的内容并没有立刻落到磁盘上,而是暂时存在内存缓冲区里,所以系统显示的文件大小还是旧的,虽然有些编辑器会读取缓存让你看起来内容已经写进去了。
结合你用Twitter API抓赛事直播推文的场景,咱们一步步解决:
问题根源
Ruby默认会对文件输出做缓冲优化,减少磁盘IO次数提升性能。尤其是你这种持续写入的流式场景(比如监听Twitter的实时推文),写入的内容会先存在内存里,直到缓冲区满了、程序正常退出,或者你手动触发刷新,才会真正写到磁盘上。这就导致你在程序运行过程中看文件大小没变化,但打开文件能看到内容(编辑器可能读了内存缓存)。
具体解决方案
1. 手动调用flush强制刷盘
每次写入推文后,调用文件对象的flush方法,把缓冲区里的内容立刻同步到磁盘:
File.open('match_events.txt', 'w') do |file| twitter_api_client.stream do |tweet| # 匹配开头为整数分钟数的赛事推文 if tweet.text.match?(/^\d+'/) file.puts tweet.text file.flush # 强制将缓冲区内容写入磁盘 end end end
2. 打开文件时开启同步模式
如果你不想每次都手动写flush,可以在打开文件时设置sync: true,让所有写入操作都直接同步到磁盘:
# 开启同步模式,写入即刷盘 File.open('match_events.txt', 'w', sync: true) do |file| twitter_api_client.stream do |tweet| if tweet.text.match?(/^\d+'/) file.puts tweet.text end end end
3. 确保程序正常退出
如果你的程序是后台运行或者用了多线程/进程,一定要保证文件对象被正常关闭(比如用do...end块自动关闭,或者手动调用file.close)。Ruby会在文件对象被垃圾回收或者程序正常终止时自动刷新缓冲区,异常退出的话可能会丢失未刷盘的内容,也会导致文件大小不更新。
额外验证小技巧
你可以在终端用tail -f match_events.txt实时监控文件内容,同时用ls -l match_events.txt看大小变化——如果用了上面的方法,每次写入推文后,文件大小应该会立刻更新。
内容的提问来源于stack exchange,提问作者lambda
相关产品推荐
相关产品推荐

