了解 Ruby 和操作系统 I/O 缓冲

2023-12-25

Ruby 中的 IO 缓冲如何工作?使用时数据刷新到底层流的频率是多少IO and File课程?这与操作系统缓冲相比如何?在自信地读回数据进行处理之前,需要做什么来保证给定的数据已写入磁盘?


Ruby IO 文档并不是 100% 清楚地说明了缓冲的工作原理,但您可以从文档中提取以下内容:

  • Ruby IO 有自己的内部缓冲区
  • 除此之外,底层操作系统可能会也可能不会进一步缓冲数据。

相关方法可以看看:

  • IO.flush http://ruby-doc.org/core/classes/IO.html#M000929:冲洗IO。我还查看了 Ruby 源代码并调用IO.flush还调用底层操作系统fflush() http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html。这应该足以缓存文件,但不能保证将物理数据写入磁盘。
  • IO.sync= http://ruby-doc.org/core/classes/IO.html#M000911:如果设置为true,没有进行 Ruby 内部缓冲。所有内容都会立即发送到操作系统,并且fflush()每次写入都会被调用。
  • IO.sync http://ruby-doc.org/core/classes/IO.html#M000910:返回当前同步设置(true or false).
  • IO.fsync http://ruby-doc.org/core/classes/IO.html#M000908:刷新 Ruby 缓冲区 + 调用fsync() http://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html在操作系统上(如果支持的话)。这将保证完全刷新到物理磁盘文件。
  • IO.close http://ruby-doc.org/core/classes/IO.html#M000939:关闭红宝石IO并将待处理的数据写入操作系统。请注意,这并不意味着fsync()。 POSIX 文档close() http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html说它不保证数据物理写入文件。所以你需要使用显式的fsync()呼吁这一点。

结论:flush and/or close应该足以缓存文件,以便另一个进程或操作可以完全读取该文件。要确定地将文件一直传输到物理介质,您需要调用IO.fsync.

其他相关方法:

  • IO.syswrite http://ruby-doc.org/core/classes/IO.html#M000904:绕过 Ruby 内部缓冲区并执行直接操作系统write。如果您使用此产品,请勿将其与IO.read/write.
  • IO.sysread http://ruby-doc.org/core/classes/IO.html#M000905:与上面相同,但用于阅读。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Ruby 和操作系统 I/O 缓冲 的相关文章

  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • 没有要加载的文件 - ffi_c (LoadError)

    这个问题困扰了我几天 每当我使用 bring to front 方法时 require rubygems require watir browser Watir Browser new browser bring to front 我收到此
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外
  • 带有 OAuth2 的 YouTube API v3:更新和删除失败并出现“权限不足”错误

    我在尝试着update and delete视频使用YouTube API v3 https developers google com youtube v3 docs videos with OAuth2 用于身份验证 https dev
  • 为 RoR 中的每个用户创建新的 URL 路径

    如何在 Ruby on Rails 中实时创建新的 URL 路径 例如 我希望我的用户拥有 name XXX com 或 XXX com name 仅供参考 我在 Heroku 上托管代码 看看 subdomain fu 插件 https
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma
  • 我可以让这个 Ruby 代码更快并且/或使用更少的内存吗?

    我有一个Array of StringRuby 中的对象由如下单词组成 animals cat horse dog cat dog bird dog sheep chicken cow 我想将其转换为另一个Array of String对象
  • 如何声明依赖于参数化任务的 Rake 任务?

    我见过一些任务具有参数和依赖项任务的示例 例如 task name first name last name gt pre name do t args args with defaults first name gt John last
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • '回应?'与“定义?”

    如果我想检查是否定义了给定名称的方法 使用哪个更好 respond to or defined 从效率的角度来看 可以有理由使用defined 因为defined 是一个内置关键字 而respond to 是一种方法 因此前者可能更快 但另
  • 处理铁路中 STI 子类路线的最佳实践

    我的 Rails 视图和控制器散布着redirect to link to and form for方法调用 有时link to and redirect to它们链接的路径是明确的 例如link to New Person new per
  • ruby 中 Array#uniq 方法的时间复杂度是多少?

    谁能告诉我 ruby 内部使用哪种算法来使用 ruby 数组删除重复项Array uniq method 来自docs http www ruby doc org core 1 9 3 Array html static VALUE rb
  • ruby rspec 不能与 simplecov 一起使用

    我安装了 simplecov gem 并添加了 require simplecov SimpleCov start 到spec helper rb文件 现在如果我在some file spec rb文件中包含spec helper rb并尝
  • 更改 en.yml 文件中的属性名称不起作用

    我更改了 ruby on Rails 项目中 en yml 文件中的属性名称 按钮工作正常 但字段属性并没有改变 这是我的模型 class Enr AffordableWarmth lt ActiveRecord Base self tab
  • 如何在 Ruby 中将 DateTime.now 转换为 UTC?

    如果我有d DateTime now 如何将 d 转换为 UTC 带有适当的日期 DateTime now new offset 0 将在标准 Ruby 中工作 即没有 ActiveSupport

随机推荐