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 리디렉션입니다.
- 열린 파일 설명자
- 데이터 투입
- 파일 설명자 닫기
- 코드 최적화
완벽한
다음과 같은 시스템 호출을 확인하십시오. ssize_t write(int fd, const void *buf, size_t count);