8개의 코어가 있는 Unix 시스템의 디렉터리에 여러 파일을 병합해야 합니다. 이 파일을 병합하는 빠른 방법을 찾고 있습니다. cat 명령은 하나의 코어만 사용합니다. 병렬 처리를 위해 여러 코어를 사용하도록 하는 방법이 있습니까?
답변1
각 라인의 추가 I/O 작업을 병렬화하는 효율적인 방법은 없습니다.~ 해야 하다차례로 적어보세요.
답변2
먼저 성능 병목 현상을 식별합니다. 디스크 IO가 병목 현상을 일으키는 경우 멀티스레딩은 쓸모가 없습니다.
매우 빠른 디스크나 SSD가 있는 경우 파일 길이를 계산하고 오프셋을 계산하고 여러 dd 명령을 사용할 수 있습니다.
답변3
다음과 같은 스크립트는 어떻습니까(sleep을 사용하여 작업을 병렬화하는 방법을 보여줌).
#!/bin/bash
eval exec 3\<<(echo FIRST FILE; sleep 3)
eval exec 4\<<(echo SECOND FILE; sleep 3)
cat <&3
cat <&4
입력 파일을 병렬로 읽습니다. 이는 여러 면에서 제한되어 있으며 출력을 병렬화하지 않지만 어쨌든 수행할 수는 없습니다.
다음은 현재 디렉터리의 모든 파일을 처리하는 보다 완전한 예입니다.
#!/bin/bash
fd=3
for file in *
do
eval exec $fd\<<(cat $file)
fd=$((fd + 1))
done
out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
cat <&${out_fd}
out_fd=$((out_fd + 1))
done
성능에 관한 위의 사항은 모두 훌륭하지만 전혀 도움이 되지 않을 수 있습니다.
고쳐 쓰다 좀 더 생각해 보면 파이프 버퍼 크기 64k만 프리페치됩니다. 다음 수정 사항은 모든 파일을 메모리로 가져옵니다. 맞지 않으면 사용하지 마세요.
#!/bin/bash
fd=3
for file in *
do
eval exec $fd\<<(content=$(<$file); echo "$content")
fd=$((fd + 1))
done
out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
cat <&${out_fd}
out_fd=$((out_fd + 1))
done