首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找、散列和替换的大量行的并发性

查找、散列和替换的大量行的并发性
EN

Unix & Linux用户
提问于 2020-12-10 17:41:39
回答 2查看 206关注 0票数 3

我有一堆文件,每一行都有一个唯一的值,我试图用散列来模糊它。

然而,文件中有3M行,对完成该过程所需时间的粗略计算在32天时是非常长的。

代码语言:javascript
运行
复制
for y in files*; do 
  cat $y | while read z; do
    KEY=$(echo $z | awk '{ print $1 }' | tr -d '"')
    HASH=$(echo $KEY | sha1sum | awk '{ print $1 }')
    sed -i -e "s/$KEY/$HASH/g" $y
  done
done

为了提高这个进程的速度,我想我必须引入一些并发性。

一次基于https://unix.stackexchange.com/a/216475的草率尝试使我发现

代码语言:javascript
运行
复制
N=4
(
for y in gta*; do 
  cat $y | while read z; do
    (i=i%N)); ((i++==0)); wait
    ((GTA=$(echo $z | awk '{ print $1 }' | tr -d '"')
    HASH=$(echo $GTA | sha1sum | awk '{ print $1 }')
    sed -i -e "s/$KEY/$HASH/g) & 
  done
done
)

效果也不太好。

示例输入

代码语言:javascript
运行
复制
"2000000000" : ["200000", "2000000000"]
"2000000001" : ["200000", "2000000001"]

示例输出

代码语言:javascript
运行
复制
"e8bb6adbb44a2f4c795da6986c8f008d05938fac" : ["200000", "e8bb6adbb44a2f4c795da6986c8f008d05938fac"]
"aaac41fe0491d5855591b849453a58c206d424df" : ["200000", "aaac41fe0491d5855591b849453a58c206d424df"]

也许我应该同时阅读这些行,然后在每一行上执行散列替换?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-12-10 19:24:51

FWIW --我认为这是在shell脚本中最快的方法:

代码语言:javascript
运行
复制
$ cat tst.sh
#!/usr/bin/env bash

for file in "$@"; do
    while IFS='"' read -ra a; do
        sha=$(printf '%s' "${a[1]}" | sha1sum)
        sha="${sha% *}"
        printf '%s"%s"%s"%s"%s"%s"%s"\n' "${a[0]}" "$sha" "${a[2]}" "${a[3]}" "${a[4]}" "$sha" "${a[6]}"
    done < "$file"
done
代码语言:javascript
运行
复制
$ ./tst.sh file
代码语言:javascript
运行
复制
$ cat file
"e8bb6adbb44a2f4c795da6986c8f008d05938fac" : ["200000", "e8bb6adbb44a2f4c795da6986c8f008d05938fac"]"
"aaac41fe0491d5855591b849453a58c206d424df" : ["200000", "aaac41fe0491d5855591b849453a58c206d424df"]"

但是,正如我在注释中提到的那样,使用内置sha1sum功能的工具(例如python )执行速度会更好。

票数 5
EN

Unix & Linux用户

发布于 2020-12-10 19:31:11

按照埃德·莫顿的建议,在蟒蛇的帮助下。

创建python脚本/tmp/sha1.py并使其可执行

代码语言:javascript
运行
复制
#! /usr/local/bin/python -u

import hashlib
import sys

for line in sys.stdin:
  words = line.split()
  str_hash=hashlib.sha1(words[0].encode())
  words[0] = str_hash.hexdigest()
  print(" ".join(words))

第一行应该包含您的python的正确位置,但不要删除"-u“。

然后是一个ksh脚本,您也应该使其可执行。

代码语言:javascript
运行
复制
#! /usr/bin/ksh

/tmp/sha1.py |&

for y in files*
do
  while read A B
  do
    eval "echo $A" >&p
    read A <&p
    echo \"$A\" $B
  done < $y > TMP.$y
  mv TMP.$y $y
done

# terminate sha1.py
exec 3>&p
exec 3>&-

现在,如果您想要性能,应该让python一次处理一个完整的文件。以下脚本将每个输入行视为文件名,并执行您的脏工作:

代码语言:javascript
运行
复制
#! /usr/local/bin/python

import hashlib
import os
import sys

for IFileNmX in sys.stdin:
  IFileNm = IFileNmX.strip()
  IFile = open(IFileNm,'r')
  OFileNm = ".".join(["TMP",IFileNm])
  OFile = open(OFileNm,'w')
  for line in IFile.readlines():
    words = line.split()
    word1 = words[0].strip('"')
    str_hash=hashlib.sha1(word1.encode())
    words[0] = "".join(['"',str_hash.hexdigest(),'"'])
    OFile.write("".join([" ".join(words),'\n']))
  OFile.close()
  IFile.close()
  os.rename(OFileNm,IFileNm)

如果您调用这个脚本/tmp/sha1f.py并使其可执行,我想知道要多长时间

代码语言:javascript
运行
复制
ls files* | /tmp/sha1f.py

会有机会。我的系统花了12秒来处理一个400 My的百万行文件。当然,这是吹嘘。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/623874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档