tamaño del archivo no es una buena medida para los archivos del libro de trabajo cuando se trabaja con PHPExcel. La cantidad de filas y columnas (es decir, celdas) es más importante.
El código PHPExcel en sí tiene una huella de entre 10 y 25 MB, según los componentes a los que se accede.
En la actualidad, cada celda de un libro de trabajo ocupa un promedio de 1k de memoria (sin ningún almacenamiento en caché) o 1.6k en PHP de 64 bits - Supongo que PHP de 32 bits, por lo que (por ejemplo) La hoja de cálculo de 8000 líneas con 31 columnas (248,000 celdas) tendrá aproximadamente 242MB. Con el almacenamiento en caché de células (como php: // temp o DiskISAM), se puede reducir a aproximadamente un tercio, por lo que las 8000 líneas por 31 columnas requerirán aproximadamente 80 MB.
Hay una serie de opciones disponibles para ayudarle a reducir el uso de memoria:
¿Está utilizando el almacenamiento en caché de células con PHPExcel?
require_once './Classes/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array(' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load("test.xlsx");
Si sólo necesita acceder a los datos en las hojas de trabajo, y no es necesario el acceso al formato de las celdas, entonces usted puede desactivar la lectura de la información de formato del libro:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
Si sólo es necesario para acceder a algunas, pero no todas las hojas del libro, puede cargar únicamente las hojas de trabajo:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly(array("Worksheet1", "Worksheet2"));
$objPHPExcel = $objReader->load("test.xlsx");
si solo deseas leer ciertas células dentro de las hojas de trabajo, que c un agregar un filtro:
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadFilter(new MyReadFilter());
$objPHPExcel = $objReader->load("test.xlsx");
Todas estas técnicas pueden reducir significativamente los requisitos de memoria.
Averigüe qué en PHP Excel está usando tanta memoria, y luego corríjala ..... – SoapBox
@SoapBox: En resumen, PHPExcel - es una verdadera memoria parabólica :(Además, es una especie de biblioteca compleja, por lo que encontrar (por no hablar de solucionar) un error no es trivial. En el peor de los casos, puede ser más fácil eludir el problema y buscar una biblioteca alternativa. – Piskvor
Conviértase en Microsoft Certified, solo requiere saber cómo reiniciar la máquina. liberará la memoria utilizada por el software leaky. –