Mic*_*per 1 ruby ubuntu ruby-on-rails
我有一个脚本生成16000个html页面并将其保存在系统中.1013页后,我收到错误:打开文件太多.
这是生成文件的Ruby代码
FileUtils.mkdir_p "public/users_directory/#{DEFAULT_COUNTRY_CODE}/#{prefix}"
FileUtils.mkdir_p "public/users_directory/#{DEFAULT_COUNTRY_CODE}/#{prefix}/#{n/1000}"
html_file = File.new("public/users_directory/#{DEFAULT_COUNTRY_CODE}/#{prefix}/#{n/1000}/#{n}.html", "w")
html_file.write(html)
html_file.close
Run Code Online (Sandbox Code Playgroud)
你可以看到我在最后一行关闭文件....
有人知道我在做错了什么吗?我有Ubuntu 8.04.4 LTS
非常感谢
编辑:
这是整个脚本
def self.fetching_directory_page(n=1, letter = nil)
id = letter == '' ? "" : "/#{letter.upcase}"
url = "this is a valid url :)"
agent = WWW::Mechanize.new
page = agent.get(url)
html = page.search('div#my_profile_body').to_html
prefix = id == '' ? 'all' : letter
FileUtils.mkdir_p "public/users_directory/#{DEFAULT_COUNTRY_CODE}/#{prefix}"
FileUtils.mkdir_p "public/users_directory/#{DEFAULT_COUNTRY_CODE}/#{prefix}/#{n/1000}"
html_file = File.new("public/users_directory/#{DEFAULT_COUNTRY_CODE}/#{prefix}/#{n/1000}/#{n}.html", "w")
html_file.write(html)
html_file.close
puts "+ CREATED #{prefix}/#{n/1000}/#{n}.html"
new_url = page.parser.xpath("//a[@class='next_page']")[0]['href'] rescue nil
if new_url.present?
self.fetching_directory_page(n+1, letter)
end
end
Run Code Online (Sandbox Code Playgroud)
它正在获取我的用户目录的所有用户并保存页面以用于缓存原因.它总共生成16000个文件.
这是ulimit-a的结果
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 24640
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 24000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 24640
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Run Code Online (Sandbox Code Playgroud)
编辑/ etc/security/limits之后我没有收到错误,Too many open files但它只是卡住了
lsof -u username返回一个或多或少600个条目的列表,并且在执行脚本时不会更改
我不确定这是否是解决问题的最佳方法,但它可能有所帮助:
尝试评论一半的代码.如果它仍然有问题,那么注释掉剩下的一半.继续这样做直到问题消失.一旦问题消失,请尝试取消注释一些代码.继续这样做,直到问题恢复.更可能的是,您刚刚取消注释的行与错误有关.这种解决问题的方法有时被称为"二进制印章".
在这种特殊情况下,您可能希望确保fetching_directory_page每次调用时都不会打开新文件而不关闭它.
| 归档时间: |
|
| 查看次数: |
7123 次 |
| 最近记录: |