파일을 연결하는 가장 빠른 방법 >> out ? 선호되는 방법은

총 20GB가 넘는 10k + 파일이 하나의 파일로 연결되어 있어야합니다.

보다 빠른 방법이 있습니까

cat input_file* >> out

?

선호되는 방법은 bash 명령이 될 것입니다. 파이썬도 상당히 느리지는 않지만 받아 들일 수 있습니다.



답변

아니, 고양이는 확실히 이것을하는 가장 좋은 방법입니다. 이 목적으로 C로 작성된 프로그램이있을 때 왜 파이썬을 사용합니까? 그러나 xargs명령 행 길이가 초과 ARG_MAX하고 둘 이상이 필요한 경우 사용을 고려할 수 있습니다 cat. GNU 도구를 사용하면 이는 이미 가지고있는 것과 동일합니다.

find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z |
  xargs -0 cat -- >>out


답변

출력 파일의 공간을 먼저 할당하면 시스템이 모든 쓰기에 대한 할당을 업데이트하지 않아도되므로 전체 속도가 향상 될 수 있습니다.

예를 들어 Linux의 경우 :

size=$({ find . -maxdepth 1 -type f -name 'input_file*' -printf '%s+'; echo 0;} | bc)
fallocate -l "$size" out &&
  find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z | xargs -r0 cat 1<> out

또 다른 이점은 사용 가능한 공간이 충분하지 않으면 복사가 시도되지 않는다는 것입니다.

에 만약 btrfs, 당신이 수 copy --reflink=always, 나머지를 추가 (데이터 복사하지 않으며, 따라서 거의 순간적인 것 의미) 첫 번째 파일. 10000 개의 파일이 있다면 첫 번째 파일이 매우 크지 않으면 큰 차이가 없을 것입니다.

모든 파일 ( BTRFS_IOC_CLONE_RANGE ioctl) 을 참조 복사하는 일반화하는 API가 있지만 API를 노출시키는 유틸리티를 찾을 수 없으므로 C (또는 python임의 ioctl의 s를 호출 할 수있는 다른 언어) 에서 수행해야합니다. .

소스 파일이 희소하거나 많은 NUL 문자 시퀀스가있는 경우 (GNU 시스템에서) 다음과 같이 희소 출력 파일 (시간 및 디스크 공간 절약)을 만들 수 있습니다.

find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out


답변