微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用服务器上文件列表的匹配模式进行有效的并行下载和解压缩

如何解决使用服务器上文件列表的匹配模式进行有效的并行下载和解压缩

每天每6个小时,我必须从网络服务器下载bz2文件,将其解压缩并将它们合并为一个文件。这需要尽可能高效和快速,因为在继续进行合并之前,我必须等待下载和解压缩阶段完成。

我已经编写了一些bash函数,这些函数将一些字符串作为输入来构造要下载的文件的URL作为匹配模式。这样,我可以将匹配模式直接传递到wget,而不必在本地构建服务器的内容列表,然后将其作为带有-iwget的列表传递。我的功能看起来像这样

parallelized_extraction(){
    i=0
    until [ `ls -1 ${1}.bz2 2>/dev/null | wc -l ` -gt 0 -o $i -ge 30 ]; do
        ((i++))
        sleep 1
    done
    while [ `ls -1 ${1}.bz2 2>/dev/null | wc -l ` -gt 0 ]; do
        ls ${1}.bz2| parallel -j+0 bzip2 -d '{}' 
        sleep 1
    done
}
download_merge_2d_variable()
{
    filename="file_${year}${month}${day}${run}_*_${1}.grib2"
    wget -b -r -nH -np -nv -nd -A "${filename}.bz2" "url/${run}/${1,}/"
    parallelized_extraction ${filename}
    # do the merging 
    rm ${filename}
} 

我称为download_merge_2d_variable name_of_variable 通过编写函数parallelized_extraction可以加快代码的速度,该函数负责在wget在后​​台运行时解压缩下载的文件。为此,我首先等待第一个.bz2文件出现,然后运行并行提取,直到服务器上出现最后一个.bz2(这是两个until和{{ 1}}循环正在执行)。

我对这种方法非常满意,但是我认为它可以改进。这是我的问题:

  • 如果我的文件列表是作为匹配模式给出的,我如何启动while的多个实例来执行并行下载?我是否必须编写多个带有“数据块”内部数据的匹配模式,还是必须从服务器下载内容列表,拆分该列表,然后将其作为输入输入wget
  • 如果文件下载速度真的很慢,
  • wget可能会失败,因为它不会找到任何新的parallelized_extraction文件提取并在下一次迭代时从循环中退出,尽管{{1} }仍在后台运行。尽管这从未发生在我身上,但这是有可能的。为了解决这一问题,我尝试通过在后台运行bz2的{​​{1}}来向第二个条件添加一个条件,以检查它是否仍然存在,但不知何故不起作用
wget

有什么线索为什么这行不通?关于如何改进我的代码的任何建议? 谢谢

更新 如果有人有兴趣,我将根据接受的答案在此发布我的工作解决方案。

PID

解决方法

您可以列出要下载的网址吗?

listurls() {
  # do something that lists the urls without downloading them
  # Possibly something like:
  # lynx -listonly -image_links -dump "$starturl"
  # or
  # wget --spider -r -nH -np -nv -nd -A "${filename}.bz2" "url/${run}/${1,}/"
  # or
  # seq 100 | parallel echo ${url}${year}${month}${day}${run}_{}_${id}.grib2
}

get_and_extract_one() {
  url="$1"
  file="$2"
  wget -O - "$url" | bzip2 -dc > "$file"
}
export -f get_and_extract_one

# {=s:/:_:g; =} will generate a file name from the URL with / replaced by _
# You probably want something nicer.
# Possibly just {/.}
listurls | parallel get_and_extract_one {} '{=s:/:_:g; =}'

这样,您将在下载和并行执行所有操作时解压缩。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。