【问题标题】:Fetching via wget to memory & bypassing disk writes通过 wget 获取内存并绕过磁盘写入
【发布时间】:2011-01-03 22:18:17
【问题描述】:

是否可以将网站的内容(一组 HTML 页面)直接下载到内存而不写入磁盘?

我有一个机器集群,每台机器都安装了 24G,但我被磁盘配额限制为几百 MB。我正在考虑将输出wget 重定向到某种内存结构而不将内容存储在磁盘上。另一种选择是创建我自己的wget 版本,但可能有一种简单的方法来使用管道

还有什么是并行运行此下载的最佳方式(集群有 >20 个节点)。在这种情况下无法使用文件系统。

【问题讨论】:

  • 您是否正在使用wget --recursive 获取该页面集
  • 嗯,听起来解决方案正在获得更高的配额。当遇到类似的问题时,我为机器购买了非常大的磁盘,并让系统管理员为我设置了它们。 :)

标签: pipe wget io-redirection ramdisk


【解决方案1】:

你是根吗?你可以使用tmpfs

重新编辑:您不受 CPU 限制,您不需要使用每台机器。您可以使用xargs -n SOME_NUMBER 来拆分您的根 url 列表,假设有多个。

但如果你热衷于共享内存,你可以设置一个集群 memcache 并将其挂载到每台机器上,并使用memcachefs

【讨论】:

  • 碰巧Linux有一个tmpfs安装在/dev/shm,每个人都可以访问(不仅仅是root)。并不是说您应该为此目的滥用它,而是... ;-)
  • 取决于您的设置和发行版,您可能已经在 /dev/shm 上安装了 tmpfs,也可能没有。
  • @ephemient 你是个坏人。 (顺便说一下,/var/lock 也可以)
  • @davr:任何使用 Glibc≥2.2 并且希望符合 POSIX.1 的 Linux 发行版都安装了/dev/shm; Glibc 通过该目录中的文件实现 POSIX 共享内存 (shm_open)。
【解决方案2】:

wget download options:

‘-O文件’

'--output-document=file'

文档不会被写入相应的文件,但所有文件将被连接在一起并写入文件。如果使用“-”作为文件,文档将打印到标准输出,禁用链接转换。 (使用“./-”打印到一个字面上名为“-”的文件。)

如果要将文件读入 Perl 程序,可以使用反引号调用 wget

根据您真正需要做什么,您可能只需使用LWP::Simpleget即可。

use LWP::Simple;
my $content = get("http://www.example.com/");
die "Couldn't get it!" unless defined $content;

更新:不知道您可以使用 FuseFuse.pm 在 Perl 中实现自己的文件系统。另见Fuse::InMemory

【讨论】:

    【解决方案3】:

    如果您 a) 已经在使用 Perl,b) 想要下载 HTML,并且 c) 解析它,我总是推荐 LWPHTML::TreeBuilder

    【讨论】:

      【解决方案4】:
      wget <url> -O -
      

      将 URL 的内容写入标准输出,然后可以在内存中捕获。

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-09
        • 2018-10-16
        相关资源
        最近更新 更多