我正在制作一个 html 界面,通过拖放和多选文件在服务器上上传图像。我想在将图片发送到服务器之前显示这些图片。所以我首先尝试使用 FileReader 但我遇到了一些问题,例如 this post .所以我改变了我的方式,我决定使用 blob:url 就像 ebidel 在帖子中推荐的那样,使用 window.URL.createObjectURL() 和 window.URL.revokeObjectURL()释放内存。
但是现在,我遇到了另一个问题,类似于this one .我希望客户可以根据需要一次上传 200 张图像。但是浏览器崩溃了,使用的ram非常高!所以我想可能是同时显示的图像太多了,我用一个数组设置了一个文件等待队列的系统,以便一次只处理 10 个文件。但是问题还是出现了。
在 Google Chrome 上,如果我检查 chrome://blob-internals/ 文件(通常已经由 window.URL.revokeObjectURL() 发布)是大约延迟 8 秒后释放。在 Firefox 上我不确定,但似乎文件没有发布(我检查了 about:memory -> images for that)
是我的代码不好,还是一个与我无关的问题?是否有强制导航器立即释放内存的解决方案?如果它能有所帮助,这就是出现问题的 JavaScript 部分:链接已过期,因为代码未包含在问题中。
编辑
这是一种自己的回答+对bennlich的回答(太长的评论文字)
我从 user1835582 的回答中了解到,我确实可以删除 Blob/File,但是当浏览器需要图像时,它会将它们保存在内存中的某个位置(这是合乎逻辑的)。所以是显示图像(很多而且很重)让我崩溃和减速的事实,而不是 revokeObjectURL 方法。此外,每个浏览器都以自己的方式管理内存,从而导致不同的行为。以下是我得出这个结论的方式。
首先,让我们尝试一下 revokeObjectURL 是否正常工作,使用一个使用 https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications#Example.3A_Using_object_URLs_to_display_images 源代码的简单示例.
使用 Chrome,您可以通过检查 chrome://blob-internals/ 或尝试将显示的图像打开到一个空白的新选项卡中来验证 Blob 是否已被撤销。注意:要完全释放 Blob 引用,请添加 document.getElementById("fileElem").value = ""。几年前我发布问题时,发布 blob 大约需要 8 秒,现在几乎是即时的(可能是由于 Chrome 的改进和/或更好的计算机)
然后,是时候进行充电测试了。我用一百张 jpg 每张 ~2.5 Mo 来做。显示图像后,我滚动页面。 Chrome 崩溃,Firefox 运行缓慢(未在其他浏览器上测试)。然而,当我评论 li.appendChild(img) 时一切顺利,即使有大量图像。这表明问题不是来自实际上工作正常的 revokeObjectURL 方法,而是来自显示大量沉重的图像。您还可以测试创建一个包含数百个沉重图像的简单 html 页面并滚动它 => 同样的结果(崩溃/减速)。
最后,为了更深入地了解图像内存管理,在 Firefox 上查看 about:memory 很有趣。例如,我看到当窗口处于事件状态时,Firefox 解压缩图像(图像 -> 未压缩堆上升),而原始(图像 -> 原始)始终稳定(相对于加载的图像数量)。这里有一个关于内存管理的很好的讨论:http://jeff.ecchi.ca/blog/2010/09/19/free-my-memory .
最佳答案
使用 window.URL.revokeObjectURL() 您只能获取 [Blob] 或 [File] 对象。您不能强制从内存中删除。
注意。 浏览器尚未最终确定,它们可能会从这些设施中泄漏。如果您实现动画,您必须了解风险自负。
关于javascript - window.URL.revokeObjectURL() 不会立即释放内存(或根本不释放)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742825/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些