AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 761134
Accepted
Alex
Alex
Asked: 2023-11-10 22:31:30 +0800 CST2023-11-10 22:31:30 +0800 CST 2023-11-10 22:31:30 +0800 CST

放慢“分裂”速度

  • 772

我有一个非常大的档案,由非常小的文件组成,连接成一个文本文件,并带有“”分隔符。对于较小的档案,我将split 使用“”作为模式进行档案,然后处理生成的文件。然而,在这个存档中,此类文件的数量级约为一亿个——显然,对于将它们全部放入一个目录来说太多了。我创建了文件夹aa、ab等,以便尝试将它们移动到创建的目录中。但是,我遇到了问题。我尝试过的事情:

  1. 没有用于split对结果文件执行任何命令的命令。所以我必须用手做。

  2. **使用将文件移动到目录中find . -name "xaa*" -exec mv {} aa \+不起作用,因为{}不在行尾。

  3. -t用于反转源和目标的标志在我的 Unix 版本中不可用。

  4. 我必须将findinto的输出通过管道传输xargs,才能正常工作。

然而,这太慢了——文件的创建速度比它们的移动速度快得多。

  1. 我怀疑xargs一次处理的文件比使用\+after 少find -exec。我尝试添加一个“-R 6000”标志,以便一次运行 6000 个条目;但是,我认为这没有什么区别。

  2. 我将 的优先级降低split到尽可能低。它消耗的 CPU 量没有变化,所以可能也没有影响。

  3. 我打开最多七个命令提示符来运行mv命令(每个命令提示符最后四个字母)——但是,这仍然不够。我会打开更多,但是一旦系统达到七个,响应就太慢了,我不得不停止分裂。ls -l | tail例如,在等待命令返回某些内容时,源存档会被复制到 USB 。

split所以我一直在做的是,在此时停止,等待mv 命令赶上,然后重新启动分割。那时我会用来 find -exec rm {} \+删除我已经拥有的文件;这有点快,所以当它到达我没有的文件时,周围的文件就会减少。

因此,第一次此类迭代持续了约 300 万个文件,下一个约 200 万个文件,下一个约 1.5 个文件。不过,我确信应该有更好的方法。还有什么想法可以尝试吗?

find
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    muru
    2023-11-10T23:17:22+08:002023-11-10T23:17:22+08:00

    类似的东西xargs -I {} ... mv {} aa仍然会mv在每行输入中运行一次。从POSIX 规范的-I选项xargs:

    Insert mode: utility is executed for each  logical  line  from  standard  input.
    

    您需要类似的东西xargs -r sh -c 'mv "$@" aa' _(或者在那时,只是find ... -exec sh -c 'mv "$@" aa' _ {} +)来真正为多个文件运行单个文件mv。这样,您就可以使用 shell 在mv目标目录之间插入参数。

    • "$@"被 shell 替换为所有参数,没有任何字段分割或通配符。
    • 的_作用与$0指定的脚本相同sh -c。之后的参数将是$1、$2等,或者统称为$@。

    即使这样,我认为你find也会参与竞争条件。它可能会在结束之前完成目录列表的读取split,因此可能无法处理所有文件。它还可能最终递归到您创建的子目录并检测之前移动到那里的文件,并且可能最终尝试再次移动aa/xaa并aa/出错(但是,-exec ... {} +忽略命令的退出状态)。

    • 1

相关问题

  • 如果未引用 -name 后面的模式,则 find 的奇怪行为

  • 将变量从子shell打印到父shell [重复]

  • 检查某个文件夹是否存在于某个目录中

  • 从命令行查找和替换 CSS 文件中的颜色

  • GNU find:在-exec中获取绝对和相对路径

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve