긴 텍스트 출력을 셸 변수의 메모리에 저장하는 것과 디스크에 쓰는 것

긴 텍스트 출력을 셸 변수의 메모리에 저장하는 것과 디스크에 쓰는 것

100,000회 반복 실행되는 루프 내에서 db2 데이터베이스 명령줄 도구에 대해 다음 호출을 수행했습니다.

(db2의 출력은 호출당 20자로 구성된 약 5줄이며 총 호출 수는 약 100,000개입니다. SP에 대한 입력은 SP의 출력 줄 앞에 추가되어 로그 파일에 덤프됩니다.

while read line
do
    db2 -x "call stored_procedure_XYZ($line)" |sed "s/^/$line/" >>log_file.txt
done<$infile

루프에서 sed 및 디스크 쓰기를 수행하여 전체 프로세스를 더 빠르게 실행하려고 합니다. 모든 출력을 변수에 저장한 다음 수정하여 디스크에 쓰는 것이 권장됩니까?

쉘 변수는 얼마나 오래 보관할 수 있나요?

(배쉬, AIX 6.1)

답변1

Bash 변수 크기는 고정되어 있지 않습니다. malloc이 충분한 메모리와 연속된 주소 공간을 찾을 수 있다면 어떤 양의 데이터도 저장할 수 있습니다. 변수에 많은 데이터를 저장한다고 가정해 보겠습니다. 변수 파일에 데이터를 쓰려고 하면 다음과 같은 오류가 발생할 수 있습니다.

/bin/echo ${LARGE_DATA} >> ${YourFile}    
/bin/echo: Argument list too long

이 오류는 명령 매개변수의 최대 길이와 관련이 있습니다. 확인하시기 바랍니다매개변수 크기 및 환경 제한execve 매뉴얼 페이지에 설명된 대로http://man7.org/linux/man-pages/man2/execve.2.html

"... 환경 및 인수 문자열을 저장하는 데 사용되는 메모리는 32페이지로 제한됩니다(커널 상수 MAX_ARG_PAGES로 정의됨). 페이지 크기가 4kB인 아키텍처에서 최대 크기는 128kB입니다. …”

편집하다:

또한 위의 /bin/echo 오류는 단지 예일 뿐이며 파일에 쓰는 동안 다른 방법을 시도하면 유사한 오류가 발생할 수 있습니다. 매개변수 크기와 관련이 있습니다.

제안:

파일 쓰기 작업이 원자적이라고 생각하면 쓰기를 위해 파이프가 생성될 때마다 파일 설명자가 열리고 닫힙니다. 시간이 좀 걸립니다. /bin/echo 또는 다른 프로그램을 사용하는 대신 C/C++와 같은 고급 언어로 자신만의 "WriteFile" 프로그램을 작성할 수 있습니다. 필요한 것은 I/O 리디렉션입니다.

  1. 열린 파일 설명자
  2. 데이터 투입
  3. 파일 설명자 닫기
  4. 코드 최적화
  5. 완벽한

    다음과 같은 시스템 호출을 확인하십시오. ssize_t write(int fd, const void *buf, size_t count);

    http://linux.die.net/man/2/write

관련 정보