2012-08-02 6 views
1

누구든지 PHP 명령 실행 및 모범 사례와 관련하여 나에게 몇 가지 지침을 줄 수 있습니까?PHP 제안/대안

현재 일부 netbackup 데이터를 구문 분석하려고하는데 시스템 호출이 반환하는 엄청난 양의 데이터와 관련된 문제가 있습니다. retreiving 데이터의 양을 줄이기 위해 나는 다음과 같은 것을하고있다.

$awk_command = "awk -F, '{print $1\",\"$2\",\"$3\",\"$4\",\"$5\",\"$6\",\"$7\",\"$9\",\"$11\",\"$26\",\"$32\",\"$33\",\"$34\",\"$35\",\"$36\",\"$37\",\"$38\",\"$39\",\"$40}'"; 
exec("sudo /usr/openv/netbackup/bin/admincmd/bpdbjobs -report -M $master_name -all_columns | $awk_command", $get_backups, $null); 
foreach ($get_backups as $backup_detail) 
    { 
    process_the_data(); 
    write_data_to_db(); 
    } 

Im 수신 할 데이터의 양을 제한하기 위해 awk를 사용한다. 그것 없이는 거의 ~ 150MB의 데이터를 수신하게되며,이 데이터로 800KB의 데이터를 관리 할 수 ​​있습니다.

awk의 똥이 불쾌하다고 나는 말할 필요가 없습니다. 이미 알고 있습니다. 그러나 나 자신 (그리고 제 코드)을 개선하기 위해 누군가가 대안을 제안 할 수 있습니까?

나는 proc_open과 같은 것을 생각하고 있었지만 실제로 이점이 있는지 확실하지 않았습니다.

+0

사용에 상당한 이점이 있습니다를'proc_open()'당신은 PHP에서 한 번에 데이터를 한 라인을 처리 할 수 ​​있으며 전체 800K를로드 할 필요가 없기 때문에 즉시 메모리에 저장하십시오. 양방향 통신이 필요 없기 때문에 더 간단한 ['popen()'] (http://php.net/popen)을 사용하는 것이 좋습니다. 나는 개인적으로 그것이 당신이 원하는 것을하고 있다면'awk'를 사용하는 것으로 잘못된 것을 보지 못합니다 - 그것은 PHP에서 같은 일을하는 것이 훨씬 더 효율적입니다. 'proc_open()'/'popen()'의 스트림을 사용하면'fgetcsv()'를 사용하여 배열을 직접 처리하지 않고 검색 할 수 있습니다. – DaveRandom

답변

1

스크립트로 전체를 읽지 않고 파일에 데이터를 쓰려면 exec를 사용하십시오.

exec("sudo /usr/openv/netbackup/bin/admincmd/bpdbjobs -report -M $master_name -all_columns | $awk_command > /tmp/output.data"); 

그런 다음 메모리 효율적인 방법으로 파일을 부분적으로 읽습니다.

여기 찾아 보게한다 : Least memory intensive way to read a file in PHP

+0

디스크로 덤프 할 이유가없는 것 같습니다. 단지 오버 헤드가 추가됩니다. 'proc_open()'/'popen()'이 사용 가능하다면 왜 디스크 쓰기/읽기를 자르고'awk's STDOUT을 직접 읽지 않을까요? – DaveRandom

+0

@DaveRandom 이는 스크립트가 수행 한 최대 메모리 사용량을 줄이는 데 도움이됩니다. 루프 내에서 라인 당 8KB를 갖는 메모리 내에서 전체 800K를 가지지 않는 것이 좋기 때문에 파일 찾기의 오버 헤드가 추가되는 것이 좋습니다. – DhruvPathak

+0

벤치마킹해야하지만, 메모리에 모두 보관하는 것이 현저하게 빠르며,할만한 가치가있을만큼 충분히 빠르다고 확신합니다. 우리가 더 많은 데이터에 대해 이야기했다면 100 % 동의 하겠지만 800k는 요즘 아무것도 아닙니다. 어쨌든 서버는 이것이 끝나면 상당한 여분의 메모리를 가져야 만한다 - awk은 단지 150MB를 사용하기 만했다. OS가 모든 메모리를 다시 가질 수 있도록 가능한 한 빨리 작업을 끝내고 싶지만 버스 속도, 서버로드 등등을 고려해야 할 요소가 많습니다. – DaveRandom