在一个文件夹中,我有34,000个配置文件。每个文件都包含一个具有唯一配置规范的对象。以下是文件内容的示例:
$obj = new obj();
$obj->name = "name":
$obj->location "nyc";
...
...
etc
每个文件长约100到200行,大小约为17k。
要将这些内容放入数据库,我有以下功能:
function retrieve_files(){
$objs = array();
$path = 'filefolder';
//retrieve a list of files as an array of objects
$files = get_files('/\.inc$/', $path, 'filename', 0);
foreach ($files as $file) {
include_once $path.'/'.$file->filename;
$objs[$obj->name] = $obj;
}
return $objs;
}
返回对象数组后,它会在另一个函数中循环,序列化,并且每个函数都保存到数据库中。
目前,我的服务器是英特尔双核3.06 Ghz处理器,内存为8 Gigs。我正在通过Ubuntu 12.04中的命令行运行脚本。
由于脚本处理CPU最大值为100%并且内存攀升直到所有8场演出都达到最大值。然后脚本崩溃了。
如何使此脚本或整体处理更有效?我希望保持在这个功能的范围内。我也希望一次性做到这一点。有没有办法重构这个使用更少资源或释放资源的数组创建并循环迭代?
答案 0 :(得分:0)
很明显,在第一个函数结束时,最终数组中有太多对象。
34 000个文件意味着数组$objects
中有34 000个对象。
可能是你应该在循环中保存对象。对于包含的每个文件,将数据库中的序列化对象保存。对于1个配置文件,您将在DB中有1行。
答案 1 :(得分:0)
不是返回所有对象,而是一次说100个对象。像这样的东西
function retrieve_files(){
$objs = array();
$path = 'filefolder';
//retrieve a list of files as an array of objects
$files = get_files('/\.inc$/', $path, 'filename', 0);
$count = 0;
foreach ($files as $file) {
include_once $path.'/'.$file->filename;
$objs[$obj->name] = $obj;
if ( $count++%100 == 0 )
{
function_to_process_obj($objs);
$objs = null;
$objs = array();
}
}
}