2009-11-03 3 views

답변

5

당신은 바이너리 unzip을 실행하면 프로세스가/간부 및

  1. 합니다 (생성 된 프로세스의 기간 동안)
  2. 소비하는 새로운 프로세스 더 많은 메모리를 인스턴스화

당신 포크 것 unzip의 올바른 경로로 구성해야합니다. 이 모든 것을 감안할 때, 나는 도서관 접근법을 강력히 선호 할 것이다.

+3

나는 이런 생각을 결코 이해하지 못합니다. fork/exec는 매우 빠른 프로세스이므로, 쉘 스크립트를 읽거나 쓰는 데 시간을 허비하는 사람은 누구나이 사실을 알고 있습니다. unzip 바이너리 자체가 소비하는 메모리는 알고리즘의 비용 및 (특히) 그 안에있는 데이터와 비교하면 사소합니다. 그리고/usr/bin/unzip은 기본적으로 모든 리눅스 배포본에 포함되어 있습니다. BSD와 Cygwin도 믿습니다. 예제 코드가'open $ input, "unzip -cp $ ARCHIVE $ FILE |"'이 아니라면 간단한 옵션을 강하게 선호합니다. –

+1

위의 * 일반적으로 *에 동의하지만,로드가 많은 서버가 있으면 fork/exec 모델로 자원 소비가 증가합니다. PID 할당, 프로세스 간 스트림 할당, 메모리 할당 (COPY시 허용). 독립 실행 형 프로세스의 경우 fork/exec 모델에 만족합니다. 서버 모델의 경우 자원 배분량이 가장 적은 모델을 선호합니다. –

+1

루프, 특히 핫 루프에서 분기하는 경우 성능 문제가 절대적으로 발생합니다. 루프가 없거나 1 초에 한 번 또는 몇 초에 한 번씩 포크를 실행하는 경우 아무런 문제가 없습니다. 또한, 시스템'unzip' 대신에 라이브러리를 사용하는 것이 이점이 될 수 있습니다; 라이브러리는 더 새롭고 버그가 적을 수 있습니다. –

14

Archive::Zip documentation에 따르면 당신은 Archive::Extract를 사용하여 더 나을 것 :

당신은 당신이 아카이브를 사용하여 보는 것이 좋습니다 추출 지퍼 (및/또는 기타 아카이브)로가는 경우 : 추출 그 대신 아카이브 별 기능을 사용하고 제거하는 것이 훨씬 쉬워지기 때문입니다.

재미 있기 때문에 Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. 그것은 Archive :: Zip이 선호되는 옵션입니다.

Archive :: Zip은 zlib 시스템 라이브러리의 하위 인터페이스 인 Compress::Raw::Zlib을 사용합니다. 그래서 순수한 Perl 구현이 아니기 때문에 성능면에서 비슷할 것입니다. unzip. 즉, 성능 관점에서 볼 때 Archive :: Zip보다 앞서 unzip을 선택할 이유가 없습니다.

+3

'Archive :: Extract'를 사용하면 다른 압축 형식에서도 작동합니다. –

1

하나의 관심사는 메모리입니다. Archive::Tar에 메모리 누수가있는 어려운 방법 (프로덕션 웹 서버가 손상됨)을 발견했습니다. 따라서 전체적으로 외부 명령에 대한 시스템 호출 대신 모듈을 사용하는 것이 좋은 생각이지만 (추론을위한 다른 응답 참조), 모듈에 문제가 없는지 확인해야합니다.