在循环中读取大文件时如何防止RubyMotion中的内存泄漏

迈克尔·C

RubyMotion应该执行自动内存管理:

RubyMotion提供自动内存管理;您不需要回收未使用的对象。

但是,当循环读取大文件时,我遇到了巨大的内存泄漏:每秒数百MB / s,就好像从未释放我的读取缓冲区一样。

如果我release在每个循环的读取缓冲区中使用泄漏,则泄漏通常会消失问题是,release循环结束后会使应用程序崩溃。

  def readBigBinaryFile(file)
#   PURE RUBY WOULD BE
#   source=File.open(file,'r')
    source =NSFileHandle.fileHandleForReadingAtPath(file)
    buffer_size=4096
    offset=0
    size=File.size(file)
    while ( offset + buffer_size ) <= size
#      PURE RUBY WOULD BE
#      source.seek(offset) 
#      abuffer = source.read( buffer_size )
#      abuffer=abuffer.to_s

      source.seekToFileOffset(offset)
      abuffer = source.readDataOfLength(buffer_size)
      offset+=buffer_size
      @dataPointer ||= Pointer.new(:uchar,4) 
      abuffer.getBytes(@dataPointer, length: 4)
      # memory leaks very rapidly in GBs if we don't release the buffer…
      # but this relase action will make the application crash once the doSomething lookp is finished
      abuffer.release
    end
    source.closeFile
    return false
  end

循环是:

x=0
while x < 10000
  my_scan_binary_instance=Scan_binary.new()        result=my_scan_binary_instance.readBigBinaryFile(NSBundle.mainBundle.pathForResource("sample1MBfile", ofType:"img"))
  puts result.to_s
  x+=1
end
puts "if we have used 'abuffer.release', we are going to crash now"

我测试了纯Ruby实现,完全没有内存泄漏,也不需要发布调用。

我发现了“如何在for循环中加载大型pickle文件时如何防止内存泄漏? ”有关Python循环中的内存泄漏,但是inabuffer=nil开头的公认解决方案无效。while blockreadBigBinaryFile

这是RubyMotion的自动内存管理中的错误,还是预期的?最重要的是,如何在不增加RubyMotion应用程序的内存使用的情况下循环读取大文件?

我已经创建了一个使用纯Ruby实现的要点,以及一个重现崩溃的示例应用程序的仓库。

瓦瓦瓦玛

尝试将循环主体包裹在中autorelease_pool do ... end这将导致自动释放的对象在每个循环中被释放。在循环结束时分配nilabuffer,将可以释放缓冲存储器,因为将不再有对其的引用。

while ( offset + buffer_size ) <= size
  autorelease_pool do
    source.seekToFileOffset(offset)
    abuffer = source.readDataOfLength(buffer_size)
    offset+=buffer_size
    @dataPointer ||= Pointer.new(:uchar,4) 
    abuffer.getBytes(@dataPointer, length: 4)

    abuffer = nil
  end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在循环中执行移位操作时C ++中的内存泄漏

当我们“必须”将循环中的指针传递给某个函数时,如何防止内存泄漏?

当文件无法容纳在Spark主内存中时,Spark如何读取大文件(PB)

防止Perl中的循环参考内存泄漏

SerialPort SerialStream在读取循环中泄漏内存

分析大文件中的数据时如何使用最小内存

无限循环中的内存泄漏

如何防止代码中的内存泄漏

如何防止广义链表中的内存泄漏?

在循环中执行Doctrine查询时发生内存泄漏

从文件中读取时,如何在for循环中查找其最后一项-Python

循环中的Estimator.predict导致TensorFlow中的内存泄漏

在循环中使用Keras时如何防止内存使用量激增

在PySpark中使用HiveContext测试时如何防止内存泄漏

使用 getline 逐行读取文件时出现内存泄漏

防止Android中的内存泄漏

在 PHP 中读取/下载大文件而不会耗尽内存

如何在C ++中读取大文件

如何从大文件中读取特定行?

循环读取多个大文件

如何防止JTextPane.setCaretPosition(int)中的内存泄漏?

JMX:如何防止Servlet容器中的Classloader内存泄漏?

内存泄漏读取文件到C中的链接列表

内存泄漏:从文件中读取和返回行

在C中循环重复超过127次时的内存泄漏

翻译大文件时如何防止会话用完

在for循环中使用数据库连接时发生内存泄漏

重新初始化相同的指针时,是否在while循环中发生内存泄漏

计数大文件中的字符时内存不足