PHP GAE - 上传和处理每行多个查询的大型CSV

时间:2018-03-12 00:36:14

标签: php google-app-engine

我有一个Cloud SQL数据库,其中包含人员及其地址列表(约400,000人)。每个月,我都会收到一个更新的CSV文件,我必须在数据库中检查a)新人,b)地址变更,以及c)删除人员,这意味着每人运行多个查询。

我可以逐行在本地计算机上成功读取CSV文件(150mb)并将查询运行到Cloud SQL数据库。我的问题是这个速度非常慢(每分钟处理的人数少于100人),并且由于GAE的文件上传限制为32mb,我无法上传文件并在服务器上运行它。

使用我的PHP GAE应用程序上传CSV文件的最快方法是什么,并对文件中的每一行运行多个查询以更新我的Cloud SQL数据库?

这是我的示例脚本:

$import_date = date("Y-m-d H:i:s");
$file = fopen('local_path/monthly_data.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {

    $id                 = $line[0];
    $address            = $line[1];
    $name               = $line[2];

    $check_id = $db->query("SELECT COUNT(id) FROM my_table WHERE id='$id'")->fetchColumn();
    if($check_id) { // The person already exists
        $check_address = $db->query("SELECT address FROM my_table WHERE id='$id'")->fetchColumn();
        if($check_address != $address) { // The address has changed
            $class->update_address($id, $address, $import_date);
        } else {
            $class->update_import_date($import_date);
        }
    } else {
        $class->add_person($id, $address, $name, $import_date);
    }
}

fclose($file);

完成此操作后,我将在$import_date之前检查包含import_dates的行,以查看哪些人不在最新的monthly_data文件中。

1 个答案:

答案 0 :(得分:2)

您可以将CSV文件直接上传到Google云端存储(GCS)存储分区 - 5TB对象大小限制 - 并调整您的应用以从中处理它。请参阅Uploading Objects

您还可以将CSV文件本地拆分为多个可接受大小的文件,以便通过您的应用上传。作为一个积极的副作用,这允许您的应用程序并行处理这些文件 - 甚至更快。

相关问题