개발 꿀팁/PHP

php 엑셀 파일 demo 읽기 및 python과의 성능 비교

Jammie 2022. 7. 21. 13:10
반응형

일. 서언
원래 이 글을 쓰려고 하지 않았는데 인터넷에서 몇 개의 demo를 복사하는 것은 다소 문제가 있습니다. 어떤 것은 AA, BB로 시작하는 것을 읽을 수 없고 어떤 것은 데이터를 읽을 수 없기 때문에, 어떤 것은 수정하고 모두에게 공유합니다. 이 demo는 저의 7000여 행, 110여 열의 데이터를 모두 읽고 수열로 쓸 수 있습니다

아래는 엑셀의 캡처본으로 비교적 큰 파일인지 알 수 있습니다

2. demo 읽기 및 비교
1, php 읽기 exceldemo

/**
 * @param $file
 * @param array $params
 * @return array
 * @throws PHPExcel_Exception
 * @throws PHPExcel_Reader_Exception
 * @params:모든 엑셀 데이터를 얻고, 이미 표제어를 붙여서 완전히 획득하였다
 * @author:ljf
 * @date:2019/12/6
 * @time:18:14
 */
function getData($file,$params = array())
{
    $path = __DIR__.'/vendor/PHPExcel_1.8.0/PHPExcel.php';
    require_once($path);
//파일 형식 가져오기
    $file_suffix = pathinfo($file)['extension'];
//다른 엑셀 버전에 따라 템플릿 설정
    $excel_temple = array('xls'=>'Excel5','xlsx'=>'Excel2007');
    $excelReader = \PHPExcel_IOFactory::createReader($excel_temple[$file_suffix]);//Office 버전이 다운사이징이 되므로 2003 버전으로 설정
    $sheet = $excelReader->load($file)->getSheet(2); //sheet1조작하다
    $excelCont = array(
        'highestCol' => $sheet->getHighestColumn(), //나열하다
        'highestRow' => $sheet->getHighestRow(), //행
        'highestColumnIndex' => PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) // 몇 줄
    );
    $countCol = isset($params['count_col']) ? $params['count_col'] : $excelCont['highestColumnIndex'];//유효한 열 수, 읽기 전에 $countCol 열만 가져옵니다
    $startRow = isset($params['need_head']) && $params['need_head'] ? 1 : 2;//첫 줄부터 읽고 표제어를 읽다
    $rightArr = array();
    //몇 줄 가져오기
    $row = $excelCont['highestRow'];
    $emptyLine = 0;
    for ($j = $startRow; $j < intval($row) + 1; $j++) {
        $retArr = array();//행의 셀에 대한 데이터
        $emptyCol = 0;
        for($i = 0; $i < $countCol;$i++){//줄 셀 순환
            $val = $sheet->getCellByColumnAndRow($i, 1)->getValue();//첫 번째 줄에 표가 있다고 가정할 때, 첫 번째 줄의 모든 열의 정보만 가져옵니다
            //가져온 헤더의 내용을 바탕으로 새 배열에 저장
            $retArr[$val] = $sheet->getCellByColumnAndRow($i, $j)->getValue(); //좌표에 따라 내용 가져오기
            $retArr[$val] = isset($retArr[$val]) ? trim($retArr[$val]) : $retArr[$val];
            if($retArr[$val] === null){
                $emptyCol++;
            }
        }
        if($emptyCol == $countCol){//这行为空行,아무 배열도 넣지 않음
            $emptyLine++;
        }else {
            $rightArr[] = $retArr;
        }
    }
    unset($sheet);
    if(empty($rightArr)){
        $result = array(
            'errcode' =>1004,
            'errmsg' =>"업로드 파일에 올바른 데이터가 없습니다",
        );
    }else{
        $result = array(
            'errcode' =>0,
            'errmsg' =>"",
            'data' =>$rightArr,
        );
    }
    return $result;
}

// 호출 방법
$start = time();
$start1 = memory_get_usage();
$file  = "./devices.xlsx";
//$result = _get_excel_metainfo($file);
$result = getData($file);
$end1 = memory_get_usage(true); //10k elements array;
$end = time();
var_dump(convert($end1)); //메모리 사용량 가져오기
var_dump($end - $start);

이상은 읽기 부분의 코드를 읽는 것이고, 구체적인 논리는 주석을 보면 됩니다. phpexcel 클래스를 도입하고, 그 클래스를 통해서 파일을 열어 열 길이, 행 길이를 얻어 배열에 순환적으로 값을 매긴다는 것입니다.

테스트하는 동안 속도가 약간 느려서 시간이 걸리고 메모리가 많이 소요됩니다

php 시간 소모 및 메모리 사용:

string(6) "178 mb" int(13)

13s가 걸리고 메모리 소모도 만만치 않다.그동안 phpexcel이 성능이 좋지 않다는 이야기를 들어왔고, 이번에 철저히 알게 된 셈인데, 13s의 판독시간은 프로그램 안에서는 받아들일 수 없고, 굳이 php로 읽어야 한다면 비동기식으로 읽으라는 조언이다. 적어도 진행을 막지 않는 것이 좋다.

비동기 폴링 참고 가능 : php 비동기 폴링 구현

2,파이썬 이 엑셀 파일을 읽어라
블로거가 php를 테스트한 후 속도가 좀 느리다고 느껴 다시 파이썬의 판다스로 읽어보고 속도를 테스트해보니 대체 코드를 읽어보면 대략 다음과 같다

pandas.DataFrame(pandas.read_excel('excel파일 경로'))
시간이 아래와 같다:
cost mem: 2850   3M 정도의 메모리 사용
cost time:  2.47637677192688

모르는 것보다도, 깜짝 놀랐습니다, 파이썬은 2.5s밖에 걸리지 않습니다, 메모리 사용량은 매우 적습니다, 이것은...

메모리 방면에서는 php가 제때에 일부 변수를 방출하지 못하기 때문에 배열에 값을 매겨 메모리 비교를 할 수 있다크고, 파이썬은 동작이 적기 때문에 메모리 비교가 정확하지 않지만, 파이썬이 더 적은 메모리를 쓰는 것도 사실이다.phpexcel은 매운 치킨이다.

3. php 호출 python 코드
php가 python 코드를 어떻게 사용하는지에 대해 많은 블로거들이 쓴 것이 있습니다. 블로거들은 여기서 많이 쓰지 않습니다. 크게집에 관심이 있으면 바이두에 가면 된다는 글이 많다.

주의:

여기서 python을 호출하는 방법은 exec() 또는 system()입니다. 이 두 함수는 실제로 매우 위험합니다. 어떤 엄격한 환경에서는 두 함수를 모두 비활성화합니다.여러분은 사용 전에 php.ini를 열고 disable_functions를 조회하여 비활성화된 함수 안에 두 함수가 있는지 확인할 수 있습니다.이 두 함수를 모두 써야 할지 고민해야 하는 것은 위험하기 때문이다.

3. 총결산
언제부터인가 블로거들이 한 가지 대안을 선택할 때, 예를 들어 여기의 php와 파이썬이 엑셀을 읽는 것과 같은 다른 대안들을 비교하게 될지 모르지만, 그 대비는 어떤 언어의 좋고 나쁨을 비교하기보다는 안정감 있게 우열을 가리는 것이다.가끔 그런 비교언어가 귀찮아. 걸핏하면 xxx언어가 쓰레기라고 생각해. 나는 이런 비교언어가 수준도 그 정도라고 생각해. 프로그래밍언어는 도구일 뿐이지 네가 억지로 외우는 게 아니라고 생각해.경치.

자도 길지만 치도 짧다.얼마 전 친구들과 의논할 때 php의 장점은 민첩한 개발, 웹 개발이라고 했는데, php가 잘하는 것은 php가 못하는 부분과 다른 언어를 잘하는 부분을 굳이 비교한다면 실망할 수밖에 없다.말하자면, 현재의 프로그래밍 언어는 매우 다양합니다. 어떤 의미에서는 여전히 각 언어의 방점이 다르기 때문입니다. 만약 정말로 어떤 언어든지 모든 면에서 우수하다면, 아마도 일찌감치 강호를 통일했을 것입니다 하하.

파이팅!

 

반응형