Tag: 内存

无法在Ruby中分配内存(No MemoryError)?

我编写了一个简单的脚本,它应该读取整个目录,然后通过删除HTML标记将HTML数据解析为普通脚本,然后将其写入一个文件。 我有8GB内存和大量可用的虚拟内存。 当我这样做时,我有超过5GB的RAM可用。 目录中最大的文件是3.8 GB。 脚本是 file_count = 1 File.open(“allscraped.txt”, ‘w’) do |out1| for file_name in Dir[“allParts/*.dat”] do puts “#{file_name}#:#{file_count}” file_count +=1 File.open(file_name, “r”) do |file| source = “” tmp_src = “” counter = 0 file.each_line do |line| scraped_content = line.gsub(//, ”) tmp_src << scraped_content if (counter % 10000) == 0 tmp_src = tmp_src.gsub( /\s{2,}/, […]

Ruby符号不是垃圾收集的!? 那么,使用String不是更好吗?

如果在循环中创建10,000个字符串,则必须进行大量垃圾收集,这会占用大量资源。 如果对符号执行相同的操作,则会创建无法进行垃圾回收的对象。 哪个更糟?

HTTParty的内存问题并下载大文件

这是否会导致Ruby的内存问题。 我知道如果大小超过10KB,Open-URI会写入TempFile。 但HTTParty会在写入TempFile之前尝试将整个PDF保存到内存中吗? src = Tempfile.new(“file.pdf”) src.binmode src.write HTTParty.get(“large_file.pdf”).parsed_response

如何处理Ruby 2.1.2内存泄漏?

我有一个工作进程,它产生多达50个线程并执行一些异步操作(大多数是http调用)。 当我启动该过程时,它从大约35MB的已用内存开始,并迅速增长到250MB。 从那时起它进一步增长,问题是内存永远不会停止增长(即使增长阶段随着时间的推移而减少)。 几天后,进程只会超出可用内存并崩溃。 我做了很多分析和分析,似乎无法找到问题所在。 即使堆大小非常不变,进程内存也在不断增长。 我已将GC.stat输出收集到您可以在此处访问的电子表格中: https://docs.google.com/spreadsheets/d/17TohDNXQ_MXM31CeAmR2ptHFYfvOeF3dB6WCBkBS_Bc/edit?usp=sharing 即使过程内存最终稳定在415MB,但它将在未来几天继续增长,直到达到512MB的限制并崩溃。 我也尝试使用对象空间跟踪对象,但跟踪对象的内存总和从不超过70-80MB,这与GC报告完全一致。 剩下的300MB +(并且还在增长)花在哪里……我不知道。 如何处理这些问题? 是否有任何工具可以让我更清楚地了解内存的使用方式? 更新:gem和操作系统 我正在使用以下gem: gem “require_all”, “~> 1.3” gem “thread”, “~> 0.1” gem “equalizer”, “~> 0.0.9” gem “digest-murmurhash”, “~> 0.3”, require: “digest/murmurhash” gem “google-api-client”, “~> 0.7”, require: “google/api_client” gem “aws-sdk”, “~> 1.44” 该应用程序部署在heroku上,但在Mac OS X 10.9.4上本地运行时,内存泄漏是显而易见的。 更新:泄漏 我已经升级了stringbuffer并分析了像@mtm建议的所有内容,现在没有leak工具识别的内存泄漏,随着时间的推移没有增加ruby堆大小,然而,进程内存仍在增长。 最初我以为它在某些时候停止了增长,但几个小时后它超过了极限并且过程崩溃了。

Sidekiq在工人完成后没有释放内存

我有大约六个执行JSON爬行的 Sidekiq工作者 。 根据端点的数据集大小,它们在1分钟到4小时之间完成。 特别是,观看长4小时,我看到随着时间的推移内存略有增加。 这不是问题,直到我想再次安排相同的工作人员工作。 内存没有被释放并堆叠,直到我遇到Linux OOM Killer,摆脱了我的Sidekiq进程。 内存泄漏 ? 我在ObjectSpace中观察了不同对象的数量: ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 } 那里没有真正的增加,哈希,数组等的集合保持不变,垃圾收集器和gc.stat[:count]告诉我,垃圾收集器也正在工作。 即使在工作人员完成之后,例如我得到[完成]记录并且没有工人正忙着,内存也不会被释放。 这是什么原因? 我可以对此做点什么吗? 写一个终结者? 目前唯一的解决方案 :重启Sidekiq进程。 我在Ruby 2.0.0上使用Ruby MRI。 对于JSON解析,我使用Yajl ,因此是C绑定。 我需要它,因为它似乎是唯一能够正确实现流式读写的快速JSON解析器。

在Ruby on Rails项目中查找内存泄漏

我有一个Ruby on Rails项目,似乎是一个内存泄漏。 它一直使用越来越多的内存,直到它崩溃。 使用ObjectSpace转储每个类的对象数量我发现了这个: Name Count ———————————————————————– String 649476 Hash 59695 Array 39407 ActiveSupport::Multibyte::Codepoint 19337 FileNode 17134 Time 3391 Regexp 1944 ActionController::Routing::DividerSegment 1743 Proc 1597 Gem::Version 1545 Class 1503 Gem::Requirement 1479 ActiveRecord::DynamicFinderMatch 1021 我相信FileNode是个问题。 这是一个模型。 任何想法如何找到保存17k FileNodes的引用? 这是使用Ruby 1.8.6和Rails 2.2.0。 不幸的是,升级不是一种选择。

Ruby内存管理

我已经使用Ruby一段时间了,我发现,对于更大的项目,它可能占用相当多的内存。 有哪些减少Ruby内存使用的最佳实践? 请让每个答案都有一个“最佳实践”,并让社区投票。

在Ruby中,存储在堆栈中的是什么?

Ruby是否在堆上分配所有内容,或者是否有任何存储在堆栈中的实例? 我的印象是所有变量基本上都在堆栈上,并且包含对堆上对象的透明引用。 我这个想法是否正确? 这个实现是否具体? 此外,如果是在堆栈上分配变量并且仅包含隐藏指针的情况,那么变量本身(忽略它们指向的对象)消耗了多少字节? 编辑: 之所以问这个问题,是因为我试图弄清楚光纤的4kB堆栈限制是否会成为这个问题的一个问题 。 似乎(使用MRI 1.9.3)每个变量本身消耗一个字节,并且与光纤相关的开销很小,这使得可用的堆栈大小减少了几个字节。 此代码将在第4,045次迭代时失败: count = 0 loop do count += 1 puts count varlist = String.new count.times do |i| varlist += “a#{i} = 1\n” end s = “fiber = Fiber.new do \n #{varlist} \n end \n fiber.resume” eval(s) end