【发布时间】:2026-01-12 15:50:01
【问题描述】:
我正在构建一个脚本来将数据从 dbase 文件迁移到 mysql 表,但是对于一些文件(大文件)它给了我这个错误:
致命错误:D:\wamp\www\dbf2MySql\LeerDbase.php 第 65 行内存不足(已分配 -1678508032)(试图分配 64 个字节)
这是代码
echo "Por favor espere...<br/>";
for ($valor = 1; $valor <= count($archivos); $valor++) {
//echo $valor;
//echo $archivos[$valor]; echo "<br/>";
$fichero_dbf = "tmp/". $archivos[$valor];
$conex = dbase_open($fichero_dbf, 0); //abro el archivo
if($conex){ //si la conexión es buena, realizo la migración
$arrData = array();
$total_registros = dbase_numrecords($conex);
for ($i = 1; $i <= $total_registros; $i++){
$arrData[] = dbase_get_record($conex,$i); //<-- Here is the memory error line
}
// Obtener la información de columna
$info_columna = dbase_get_header_info($conex);
//Busco los titulos o cabeceras
for ($i = 0; $i < count($info_columna); $i++) {
$titulos[$i] = $info_columna[$i]['name'];
if (in_array($info_columna[$i]['name'], $titulos)) {
$titulos[$i] = $info_columna[$i]['name']."_".$i;
}
}
//print_r($titulos);
//echo DibujarTabla($titulos, $arrData);
$arreglo = explode(".", $archivos[$valor]);
//Paso los datos a mysql
CrearTablaMySql($arreglo[0], $dbf2MySql, $titulos, $arrData, $database_dbf2MySql, $total_registros);
}else{
echo "No se pudo acceder al fichero dbf -> '" . $fichero_dbf . "'<br/>"; //Si me da un error muestro un error
}
dbase_close($conex); //Cierro la conexión al archivo
if ($valor == (count($archivos))) {
echo "FINALIZADO";
mysqli_close($dbf2MySql);
}
}
任何帮助将不胜感激,如果您需要更多信息来帮助我解决此问题,请告诉我
已编辑
更新
我现在使用命令行,但我现在使用 php.exe 得到这个错误
D:\wamp\bin\php\php5.5.12>php.exe -f "D:\wamp\www\dbf2MySql\CommandScript.php" errmxite.dbf 支持espere...
致命错误:调用 D:\wamp\www\dbf2MySql\Co 中的未定义函数 dbase_open() mmandScript.php 第 33 行
调用堆栈: 0.0007 273304 1. {main}() D:\wamp\www\dbf2MySql\CommandScript.php:0
这是更新的代码
解决方案
我使用 php 命令行执行了一些更改的脚本,现在它可以正常工作了,谢谢大家
【问题讨论】:
-
在将它们写入 MySQL 之前,不要从 dbase 读取所有记录并将它们放入数组中...读取一个,写入一个,读取下一个,写入下一个,等等
-
或者将sql查询保存到文件中,然后导入MySQL。不要将所有内容都存储在内存中。
-
脚本是要迁移的,我构建了mysql语句以便稍后执行它们
-
当我每个 cicle @Cheery 执行一个时,它给出了同样的错误