łączę co user2864740 powiedział: „Problemem jest wykorzystanie w pamięci spowodowane przez sam zespół i nie chodzi tu o«czytanie»plik”
moje rozwiązanie to:
- podzielić `array $ priceList`
- obciążenia tylko 1 raz rozdzielonego na tablicy w pamięci
- zachować inne podzielony tablic w pliku pośrednim
N.B: i nie sprawdzić, co pisałem
<?php
define ("MAX_LINE", 10000) ;
define ("CSV_SEPERATOR", ',') ;
function intermediateBuilder ($csvFile, $intermediateCsvFile) {
$pricelist = array();
$currentLine = 0;
$totalSerializedArray = 0;
if (!is_file()) {
throw new Exception ("this is not a regular file: " . $csv);
}
$fp = fopen ($csvFile, 'r');
if (!$fp) {
throw new Exception ("can not read this file: " . $csv);
}
while (($line = fgetcsv($fp, 0, CSV_SEPERATOR)) !== FALSE) {
if ($line) {
$pricelist[$line[2]] = $line;
}
if (++$currentLine == MAX_LINE) {
$fp2 = fopen ($intermediateCsvFile, 'a');
if (!$fp) throw new Exception ("can not write in this intermediate csv file: " . $intermediateCsvFile);
fputs ($fp2, serialize ($pricelist) . "\n");
fclose ($fp2);
unset ($pricelist);
$pricelist = array();
$currentLine = 0;
$totalSerializedArray++;
}
}
fclose($fp);
return $totalSerializedArray;
}
/**
* @param array : by reference unserialized array
* @param integer : the array number to read from the intermediate csv file; start from index 1
* @param string : the (relative|absolute) path/name of the intermediate csv file
* @throw Exception
*/
function loadArray (&$array, $arrayNumber, $intermediateCsvFile) {
$currentLine = 0;
$fp = fopen ($intermediateCsvFile, 'r');
if (!$fp) {
throw new Exception ("can not read this intermediate csv file: " . $intermediateCsvFile);
}
while (($line = fgetcsv($fp, 0, CSV_SEPERATOR)) !== FALSE) {
if (++$currentLine == $arrayNumber) {
fclose ($fp);
$array = unserialize ($line);
return;
}
}
throw new Exception ("the array number argument [" . $arrayNumber . "] is invalid (out of bounds)");
}
Przykład użycia
try {
$totalSerializedArray = intermediateBuilder ($DIR . 'datafeeds/pricelist.csv',
$DIR . 'datafeeds/intermediatePricelist.csv');
$priceList = array() ;
$arrayNumber = 1;
loadArray ($priceList,
$arrayNumber,
$DIR . 'datafeeds/intermediatePricelist.csv');
if (!array_key_exists ($key, $priceList)) {
if (++$arrayNumber > $totalSerializedArray) $arrayNumber = 1;
loadArray ($priceList,
$arrayNumber,
$DIR . 'datafeeds/intermediatePricelist.csv');
}
catch (Exception $e) {
// TODO : log the error ...
}
import do db prawdopodobnie –
Pliki są aktualizowane codziennie, czasami kolumny są również przenoszone, więc nie jest idealny do korzystania z DB .. przynajmniej w tej chwili. – 3zzy
Ten plik jest obecnie czytany wiersz po wierszu. Problem polega na wykorzystaniu pamięci w samej macierzy i nie polega na "odczytywaniu" pliku. Musisz zmienić logikę w taki sposób, aby * nie musiał ładować wszystkich danych naraz *, uzyskać hosta z większym limitem pamięci lub użyć pamięci dodatkowej (takiej jak DB, pamięć podręczna poza procesami lub inne pliki) dla danych tymczasowych/przetwarzania, itp. – user2864740