class 的数千个顺序实例化的资源管理
Resource management with thousands of sequential instantiations of a class
给定一个包含几千个 URL 的电子表格,我将遍历它们并为每个实例化一个 Page()
class 然后调用两个方法,第一个获取页面,第二个获取页面用 lxml
解析。 (urllib2
和 lxml
根据我的经验,他们的工作做起来非常快,这就是为什么我认为我不需要使用多线程,反正我没有经验):
class Page(object):
"""Representation of any page to be scraped"""
def __init__(self, url):
self.url = url
def fetch(self):
""" Fetch the URL. Return raw (text) source."""
self.source = # do urllib stuff
def parse(self):
""" Extract page elements with lxml """
我对 Python 中的内存管理知之甚少。是否有必要或谨慎地执行以下任何操作?
- 使用完 Page 对象的方法后,调用
del
- 使用上下文管理器(
with Page(url) as page:
)
- 任何其他最小化资源使用的技术
根据您所透露的内容,一次又一次地重复使用一个 Page 对象就足够了,因为您提到过,您想按顺序遍历所有页面。
@ferdy 的回答基本正确。但一般来说,只有在使用大量内存时才需要管理内存。
据我了解,您将实例化一个页面,获取内容,对其调用 page.parse(),然后……什么?
如果您不持有 url,也不持有页面内容,那么 Python GC 将根据需要回收内容。
如果你正在引用 page
对象中的内容,并且你还引用了一些其他数据结构中的内容,那么世界上所有的 del
调用都不会帮助你,因为内容将比您通过释放 URL 取回的任何一点内存大得多。
简短回答:在它成为问题之前不要担心,然后在 SO 上创建一个新的 post 并描述您最终遇到的实际问题。
给定一个包含几千个 URL 的电子表格,我将遍历它们并为每个实例化一个 Page()
class 然后调用两个方法,第一个获取页面,第二个获取页面用 lxml
解析。 (urllib2
和 lxml
根据我的经验,他们的工作做起来非常快,这就是为什么我认为我不需要使用多线程,反正我没有经验):
class Page(object):
"""Representation of any page to be scraped"""
def __init__(self, url):
self.url = url
def fetch(self):
""" Fetch the URL. Return raw (text) source."""
self.source = # do urllib stuff
def parse(self):
""" Extract page elements with lxml """
我对 Python 中的内存管理知之甚少。是否有必要或谨慎地执行以下任何操作?
- 使用完 Page 对象的方法后,调用
del
- 使用上下文管理器(
with Page(url) as page:
) - 任何其他最小化资源使用的技术
根据您所透露的内容,一次又一次地重复使用一个 Page 对象就足够了,因为您提到过,您想按顺序遍历所有页面。
@ferdy 的回答基本正确。但一般来说,只有在使用大量内存时才需要管理内存。
据我了解,您将实例化一个页面,获取内容,对其调用 page.parse(),然后……什么?
如果您不持有 url,也不持有页面内容,那么 Python GC 将根据需要回收内容。
如果你正在引用 page
对象中的内容,并且你还引用了一些其他数据结构中的内容,那么世界上所有的 del
调用都不会帮助你,因为内容将比您通过释放 URL 取回的任何一点内存大得多。
简短回答:在它成为问题之前不要担心,然后在 SO 上创建一个新的 post 并描述您最终遇到的实际问题。