<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 사전 코드 예제,기사의 내용과 관련이 없습니다.</span></span><span>
</span><span><span class="hljs-variable">$exampleArray</span></span><span> = </span><span><span class="hljs-title function_ invoke__">range</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(fn(</span><span><span class="hljs-variable">$x</span></span><span>) => </span><span><span class="hljs-variable">$x</span></span><span> * </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-variable">$exampleArray</span></span><span>));
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
존재하다PHP대규모 데이터를 처리 할 때,`array_map` 매우 편리한 기능입니다,배열의 각 요소에 콜백 함수를 빠르게 적용 할 수 있습니다.。하지만,데이터 볼륨이 매우 큰 경우,메모리 관리에주의를 기울이지 않는 경우,과도한 메모리 소비를 유발할 수 있습니다,메모리 오버 플로우 오류를 던지는 것조차도。다음은 사용하기위한 것입니다 `array_map` 메모리 최적화 팁。
</span><span><span class="hljs-comment">### 1. 모든 데이터를 한 번에로드하지 마십시오</span></span><span>
존재하다处理大规模数据时,한 번에 전체 데이터 세트를 메모리에로드하지 않도록하십시오.。배치 또는 발전기로 읽을 수 있습니다(</span><span><span class="hljs-built_in">Generator</span></span><span>)메모리 사용을 줄입니다。예를 들어,발전기를 사용하여 주문형 배열 요소를 생성합니다,한 번에 완전한 배열을 생성하는 대신:
```php
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">largeDataGenerator</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$size</span></span></span><span>) {
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-variable">$size</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-keyword">yield</span></span><span> </span><span><span class="hljs-variable">$i</span></span><span>;
}
}
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-title function_ invoke__">largeDataGenerator</span></span><span>(</span><span><span class="hljs-number">1000000</span></span><span>) </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 모든 데이터를 처리합니다</span></span><span>
}
</span></span>
이것은 많은 배열을 한 번에로드하지 않도록 array_map 또는 iterator_map (Custom Iterator 함수)을 사용하여 단계별 처리를 구현할 수 있습니다.
Array_Map은 기본적으로 새 배열을 반환하므로 원래 배열의 데이터가 복사됩니다. 원래 배열이 매우 큰 경우 원래 배열을 직접 수정하거나 Array_Map 대신 루프를 사용하여 메모리를 저장하는 것을 고려할 수 있습니다.
<span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> &</span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-variable">$item</span></span><span> = </span><span><span class="hljs-title function_ invoke__">processItem</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>); </span><span><span class="hljs-comment">// 원래 배열을 수정하십시오,새 배열을 피하십시오</span></span><span>
}
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>); </span><span><span class="hljs-comment">// 견적 잠금 해제,우발적 인 수정을 방지하십시오</span></span><span>
</span></span>
대규모 배열을 처리 할 때 중간 배열이 생성되면 제 시간에 방출하면 메모리 압력이 줄어들 수 있습니다.
<span><span><span class="hljs-variable">$processed</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'processItem'</span></span><span>, </span><span><span class="hljs-variable">$largeArray</span></span><span>);
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$largeArray</span></span><span>); </span><span><span class="hljs-comment">// 원래 배열 메모리를 자유롭게하십시오</span></span><span>
</span></span>
때로는 배열 자체가 대규모 데이터를 처리하기위한 최선의 선택이 아닐 수도 있습니다. 예를 들어, 데이터가 연속적인 숫자 값의 시퀀스이거나 반복자로 표시 될 수있는 경우, 생성기 또는 SPL 데이터 구조 (예 : SPLFixedArray )를 직접 사용하여 메모리 소비를 줄입니다.
<span><span><span class="hljs-variable">$fixedArray</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">SplFixedArray</span></span><span>(</span><span><span class="hljs-number">1000000</span></span><span>);
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">1000000</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-variable">$fixedArray</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>] = </span><span><span class="hljs-variable">$i</span></span><span> * </span><span><span class="hljs-number">2</span></span><span>;
}
</span></span>
SplfixedArray는 배열 내부의 해시 테이블 오버 헤드를 피하기 때문에 일반 배열보다 많은 메모리 풋 프린트를 저장합니다.
Nesting array_map은 다층 중간 배열을 생성하여 많은 메모리를 소비합니다. 중첩 작업을 루프 또는 반복자로 분할하여 메모리 피크를 줄이기 위해 처리 할 수 있습니다.
대규모 데이터를 처리 할 때 Array_Map은 편리하지만 메모리 소비가 높을 수 있습니다. 최적화 방법은 다음과 같습니다.
생성기를 사용하여 요청시 데이터를 처리하십시오.
큰 배열을 한 번에 복사하지 말고 원래 배열을 직접 수정하십시오.
더 이상 시간에 사용되지 않는 중간 변수를 해제하십시오.
SplfixedArray 와 같은 더 많은 메모리 절약 데이터 구조를 사용하십시오.
루프 나 반복자를 대신 사용하여 다층 중첩 Array_map을 피하십시오.
위의 방법을 통해 코드의 단순성을 유지하면서 메모리 사용량을 크게 줄이고 대규모 데이터 처리의 안정성과 효율성을 향상시킬 수 있습니다.
<span></span>
관련 태그:
array_map