恒定时间文本文件修改

时间:2013-05-20 14:02:06

标签: python bash

我有一组相当大的文件(每个大约50兆字节,至少有一百个),但我需要在每个文件上插入一个小标题(大约24行)以进行处理。我希望用bash或python编写一个脚本来完成它,但我找不到一个让我插入文本文件前面的常量函数。如果不是恒定的时间,我认为完成它需要很长时间。有没有人有这个问题的经验?

3 个答案:

答案 0 :(得分:4)

与Uwe的答案类似,但如果您的处理工具只能接受参数作为文件名,则可以使用mkfifo(1)伪造一个。

例如,在bash ...

echo 'My header' > header.txt
echo 'My content' > content.txt
mkfifo fakefile.txt
cat header.txt content.txt > fakefile.txt &
cat fakefile.txt

...将流式传输两个文件的内容,而不是创建新文件。

答案 1 :(得分:3)

您不能在常量时间内将文本插入Unix文件,无论是在开头还是在中间。另一方面,根据您的处理过程,您可以完全避免插入。如果您的处理工具能够从管道中读取,它可以正常工作。那么您可以执行类似

的操作
cat headerfile datafile | myprocessingtool

这样就不会实际修改数据文件。

答案 2 :(得分:2)

我相信这是你将要做的最好的事情(bash):

MYHEADER=/path/to/the/header
HEADERSIZE=$(stat --format %s "$MYHEADER")

for FILENAME in $FILES; do
    OLDSIZE=$(stat --format %s "$FILENAME")
    cat "$MYHEADER" "$FILENAME" > /tmp/headerize.tmp
    NEWSIZE=$(stat --format %s /tmp/headerize.tmp)
    EXPECTEDSIZE=$(($HEADERSIZE+$OLDSIZE))
    if [ "$NEWSIZE" -eq "$EXPECTEDSIZE" ]; then
      mv /tmp/headerize.tmp "$FILENAME"
    else
      echo "Something odd happened when processing $FILENAME, headerization skipped for this file."
    fi
done

除非你有一个严重可怜的系统或太长的标准太长时间,这应该在适当的时间完成。它包括错误检查。 当然,您应确保标题以换行符结尾,否则最终标题行和第一个文本文件行将合并。

此处唯一剩下的优化是确保将临时文件写入与原始文件相同的文件系统;这可能会加速mv命令。

通常,内容插入很慢。无论是内存还是磁盘都是如此。我相信你永远不会找到一个恒定时间的解决方案。但是,您可能实际上并不需要一次性批处理作业。

这是IMO在Python中可以做的最快的实现。由于它不会创建临时文件,因此可能比bash版本更快:

MYHEADERPATH=/path/to/the/header
with open(MYHEADERPATH, 'r') as f:
    header = f.read()
for filename in files:
    with open(filename, 'r') as f:
        content = f.read()
    with open(filename, 'w') as f:
        f.write(header + content)

但是如果你想要它是严格安全的,你必须以与bash脚本相同的方式进行,所以最终可能没有什么速度差异。