繁体   English   中英

如何在“ OSError:[Errno 28]设备上没有剩余空间”失败时最好地处理Scrapy缓存?

[英]How to best handle Scrapy cache at 'OSError: [Errno 28] No space left on device' failure?

如果Scrapy发生异常失败,建议采取什么措施:

OSError:[Errno 28]设备上没有剩余空间

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/twisted/internet/defer.py", line 1386, in _inlineCallbacks
    result = g.send(result)
  File "/usr/lib/python3.6/site-packages/scrapy/core/downloader/middleware.py", line 53, in process_response
    spider=spider)
  File "/usr/lib/python3.6/site-packages/scrapy/downloadermiddlewares/httpcache.py", line 86, in process_response
    self._cache_response(spider, response, request, cachedresponse)
  File "/usr/lib/python3.6/site-packages/scrapy/downloadermiddlewares/httpcache.py", line 106, in _cache_response
    self.storage.store_response(spider, request, response)
  File "/usr/lib/python3.6/site-packages/scrapy/extensions/httpcache.py", line 317, in store_response
    f.write(to_bytes(repr(metadata)))
OSError: [Errno 28] No space left on device

在该特定情况下,一个ramdisk / TMPFS限制为128 MB被用作高速缓冲存储器的磁盘,与scrapy设置HTTPCACHE_EXPIRATION_SECS = 300httpcache.FilesystemCacheStorage

HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 300
HTTPCACHE_DIR = '/tmp/ramdisk/scrapycache' # (tmpfs on /tmp/ramdisk type tmpfs (rw,relatime,size=131072k))
HTTPCACHE_IGNORE_HTTP_CODES = ['400','401','403','404','500','504']
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

我可能是错的,但是我得到的印象是Scrapy的FilesystemCacheStorage可能无法很好地管理其缓存(存储限制) (?)

使用LevelDB会更好吗?

你是对的。 缓存过期后,不会删除任何内容。 HTTPCACHE_EXPIRATION_SECS设置仅决定是否对所有HTTPCACHE_STORAGE使用缓存响应还是重新下载。

如果缓存数据非常大,则应考虑使用DB而不是本地文件系统进行存储。 或者,您可以扩展后端存储以添加LoopingCall任务,以连续删除过期的缓存。

为什么要抓紧地保留被忽略的数据?

我认为有两点:

  • HTTPCACHE_EXPIRATION_SECS控制是使用缓存响应还是重新下载,它仅保证您使用的HTTPCACHE_EXPIRATION_SECS过期缓存。 不同的蜘蛛可能会设置不同的expiration_secs,删除缓存将使缓存混乱。

  • 如果要删除过期的缓存,则需要一个LoopingCall Task来连续检查过期的缓存,这会使scrapy扩展更加复杂,而这并不是scrapy想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM