0

在一个文件夹中,我有 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;
}

一旦对象数组被返回,它就会在另一个函数中循环,序列化,并且每个都保存到数据库中。

目前,我的服务器是 Intel 双核 3.06 Ghz 处理器,具有 8 Gigs 的 RAM。我正在通过 Ubuntu 12.04 中的命令行运行脚本。

随着脚本的处理,CPU 达到 100% 的最大值并且内存不断攀升,直到所有 8 个演出都达到最大值。然后脚本崩溃。

我怎样才能使这个脚本或整个过程更有效率?最好我宁愿留在这个功能的范围内。我也希望一次性完成。有没有办法在创建数组和迭代循环时使用更少的资源或释放资源来重构它?

4

2 回答 2

0

很明显,在第一个函数结束时,最终数组中有太多对象。

34 000 个文件意味着阵列中有 34 000 个对象$objects

可能您应该将对象保存在循环中。对于包含的每个文件,您将序列化对象保存在数据库中。对于 1 个配置文件,您将在 DB 中有 1 行。

于 2013-03-18T06:09:56.817 回答
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();
            }
    }
}
于 2013-03-18T06:22:20.113 回答