在一个文件夹中,我有34000个配置文件。每个文件都包含一个具有唯一配置规范的对象。以下是文件内容的示例:
$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;
}
一旦返回对象数组,它就会在另一个函数中循环,序列化,并将每个数组保存到数据库中。
目前,我的服务器是Intel双核3.06 Ghz处理器,内存为8 Gigs。我在Ubuntu 12.04中通过命令行运行该脚本。
当脚本处理时,CPU达到100%的最大值,内存攀升,直到所有8个Gig都达到最大值。然后脚本崩溃。
如何使这个脚本或整个过程更高效?我更愿意呆在这个职能的范围内。我也更喜欢一次性完成。有没有一种方法可以重构它,在创建数组和迭代循环时使用更少的资源或释放资源?
与其返回所有对象,不如说一次返回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();
}
}
}
很明显,在第一个函数末尾的最终数组中有太多对象。
34000个文件意味着数组$objects
中有34000个对象。
可能您应该将对象保存在循环中。对于包含的每个文件,都将序列化对象保存在数据库中。对于1个配置文件,您将在DB中有1行。