Linux 每秒多次写入,使用Ubuntu将数据附加到1 GB文件中,不会出现性能问题。可能的

Linux 每秒多次写入,使用Ubuntu将数据附加到1 GB文件中,不会出现性能问题。可能的,linux,bash,shell,ubuntu,cat,Linux,Bash,Shell,Ubuntu,Cat,我有一个不断增长的文本文件。它最终将增长到超过1GB或远远超过1GB 我使用Ubuntu和shell脚本append/cat将多个小文本文件中的数据添加到一个大文件中,有时每秒写入多个文件 目前,在将113500个较小的文本文件中的数据写入时,它的容量已经增长到了60MB以上。所有文本文件都与要写入数据的文件位于同一目录中 我关心的是如何在不降低性能的情况下提高性能并加速读/写过程 下面是我正在使用的shell脚本,它一次对它们进行500次批处理,并通过cron每3分钟运行一次 想法?思想?更好

我有一个不断增长的文本文件。它最终将增长到超过1GB或远远超过1GB

我使用Ubuntu和shell脚本append/cat将多个小文本文件中的数据添加到一个大文件中,有时每秒写入多个文件

目前,在将113500个较小的文本文件中的数据写入时,它的容量已经增长到了60MB以上。所有文本文件都与要写入数据的文件位于同一目录中

我关心的是如何在不降低性能的情况下提高性能并加速读/写过程

下面是我正在使用的shell脚本,它一次对它们进行500次批处理,并通过cron每3分钟运行一次

想法?思想?更好的方法

#!/bin/bash

c=0
d=500

for file in $(find . -maxdepth 1 -type f \( ! -name file1.txt -a ! -name file2.txt  ! -name file3.txt \))
do
    cat $file >> cat.txt
    rm $file
    c=$((c+1))
    if [ $c -eq $d ]; then
        break
    fi
done
可能的改进:

  • 只需一次性完成所有文件:

    find . -maxdepth 1 -type f \( ! -name file1.txt -a ! -name file2.txt  ! -name file3.txt \) -exec cat {} >> cat.txt +
    
    一次执行500个只会添加一个您可能不关心的检查,并产生比需要多得多的
    cat
    进程。您需要单独删除这些文件,但只需将
    -exec
    部分更改为
    -delete
    即可。如果在处理文件时必须删除这些文件,因为可能会有新文件出现,您只需编写一个小脚本即可使用,而不是在上面的命令中使用
    cat

    cat "$@"
    rm "$@"
    
  • 如果使用硬盘作为存储介质,请将输出文件保存到与源文件不同的位置。这减少了搜索的需要

删除
>cat.txt
并将其附加到
done
以在此循环中打开和关闭文件
cat.txt
仅一次。确保
cat.txt
不是您的
find
命令的结果。$(…)中的x的
本身存在危险的错误。例如,如果在结果中使用
触摸“*”
创建了一个文件,则会发生非常糟糕的情况。例如,如果
file1.txt
file2.txt
位于当前工作目录中,则会被删除。请参阅关于从“代码>迭代查找输出<代码>安全正确的指南,请考虑运行您的代码并修复它所发现的内容。(每个错误代码都是指向wiki页面的链接,该页面描述了问题以及如何解决问题;这些wiki页面非常有用)。谢谢。我感谢你的迅速反应。你是说移除for循环吗?现在我在想,如果在进程运行时不断添加文件会发生什么情况?我们希望将
-exec
-delete
操作放在同一个
find
调用上,以确保它们出现在相同的文件上。也就是说,如果在正在进行的进程中添加了文件,整个方法可能是错误的,您(@MikeP)可能应该使用类似这样的方法来检测每个文件的创建完成时间(通过触发
close
事件);否则,您可以在创建过程中附加和删除软件只写了一半的文件。@CharlesDuffy-那么在使用incron时,在执行新的cron进程之前,它会首先检查以确保另一个进程没有运行吗?我现在正在安装并试一试。@MikeP,…并不是说没有安全锁定文件的方法--
fuser
可以做到这一点,还有一些习惯用法是只有在完全编写文件时才将文件重命名为其最终名称,但它们都需要创建文件的过程配合。