我有一个小脚本,它简单地读取文件的每一行,检索id字段,运行实用程序来获取名称,并将名称附加到末尾。问题是输入文件很大(2 2GB)。由于输出与输入相同,但附加了10-30个字符名称,因此它具有相同的数量级。我如何优化它以读取大缓冲区,在缓冲区中处理,然后将缓冲区写入文件,从而最大限度地减少文件访问次数?
#!/bin/ksh
while read line
do
id=`echo ${line}|cut -d',' -f 3`
NAME=$(id2name ${id} | cut -d':' -f 4)
if [[ $? -ne 0 ]]; then
NAME="ERROR"
echo "Error getting name from id2name for id: ${id}"
fi
echo "${line},\"${NAME}\"" >> ${MYFILE}
done < ${MYFILE}.csv谢谢
发布于 2010-12-14 02:57:23
通过在循环的每次迭代中消除对cut的两次调用,可以大大提高速度。将输出文件的重定向移动到循环的末尾也可能会更快。由于您没有展示输入行的示例,或者id2name由什么组成(它可能是一个瓶颈)或者它的输出是什么样子,所以我只能提供这个近似值:
#!/bin/ksh
while IFS=, read -r field1 field2 id remainder # use appropriate var names
do
line=$field1,$field2,$id,$remainder
# warning - reused variables
IFS=: read -r field1 field2 field3 NAME remainder <<< $(id2name "$id")
if [[ $? -ne 0 ]]; then
NAME="ERROR"
# if you want this message to go to stderr instead of being included in the output file include the >&2 as I've done here
echo "Error getting name from id2name for id: ${id}" >&2
fi
echo "${line},\"${NAME}\""
done < "${MYFILE}.csv" > "${MYFILE}"操作系统会为你做缓冲。
编辑:
如果您的ksh版本没有<<<,请尝试如下所示:
id2name "$id" | IFS=: read -r field1 field2 field3 NAME remainder(如果您使用的是Bash,这将不起作用。)
https://stackoverflow.com/questions/4431863
复制相似问题