我有一个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文件中。
答案 0 :(得分:2)
您可以将CSV文件直接上传到Google云端存储(GCS)存储分区 - 5TB对象大小限制 - 并调整您的应用以从中处理它。请参阅Uploading Objects。
您还可以将CSV文件本地拆分为多个可接受大小的文件,以便通过您的应用上传。作为一个积极的副作用,这允许您的应用程序并行处理这些文件 - 甚至更快。