【问题标题】:Ruby | binread : failed to allocate memory (NoMemoryError)红宝石 | binread : 分配内存失败 (NoMemoryError)
【发布时间】:2012-02-13 00:05:45
【问题描述】:

运行以下代码

Dir.foreach(FileUtils.pwd()) 做 |f| 如果 f.end_with?('lo​​g') File.open(f) 做 |文件| 如果 File.size(f) > MAX_FILE_SIZE 放 f 放置文件.ctime 放置文件.mtime # 压缩文件 原始= f Zlib::GzipWriter.open('arch_log.gz') 做 |gz| gz.mtime = File.mtime(orig) gz.orig_name = orig gz.write IO.binread(orig) puts "文件已归档" 结尾 #删除文件 开始 文件.delete(f) puts "文件已被删除" 救援异常 => e 提出“文件#{f}无法删除” 提出“错误#{e.message}” puts "======= 请手动删除文件 ========== 结尾 结尾 结尾 结尾 结尾

此外,文件非常重,超过 1GB。任何帮助将不胜感激。

【问题讨论】:

    标签: ruby memory


    【解决方案1】:

    如果您正在阅读的文件大于 1GB,则您必须至少有这么多可用内存,因为IO.binread 会占用这个数量。

    你最好加载一个已知数量并循环输入,直到它被完全读取、读取和写入块。

    来自文档:

    IO.binread(name, [length [, offset]] ) -> 字符串 -------------------------------------------------- ---------------------------- 打开文件,可选择寻找给定的偏移量,然后返回 长度字节(默认为文件的其余部分)。 binread 确保 文件在返回前关闭。打开模式为“rb:ASCII-8BIT”。 IO.binread("testfile") #=> "这是第一行\n这是第二行\n这是第三行\n以此类推...\n" IO.binread("testfile", 20) #=> "这是第一行\nThi" IO.binread("testfile", 20, 10) #=> "ne one\nThis is line "

    【讨论】:

    • 我也在文档中看到了这一点,我想知道是否有更类似于 .net 上的文件流的替代方案,因此 ruby​​ 不会在每次调用 binread 时不断创建文件句柄。
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2013-10-19
    • 2016-04-29
    • 2017-12-17
    • 2021-06-22
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多