0

我在玩 MongoDB,我试图将 .csv 文件导入数据库,但我遇到了奇怪的错误。在上传脚本的过程中只是无缘无故地结束,当我尝试再次运行它时没有任何反应,唯一的解决方案是重新启动 apache。我已经在 php.ini 中设置了无限超时 这是脚本。

$dir = "tokens/";
$fileNames = array_diff( scandir("data/"), array(".", "..") );

foreach($fileNames as $filename)
    if(file_exists($dir.$filename))
        exec("d:\mongodb\bin\mongoimport.exe -d import -c ".$filename." -f Date,Open,Next,Amount,Type --type csv --file ".$dir.$filename."");

我得到了大约 7000 个 .csv 文件,它在脚本结束之前只插入了大约 200 个。

任何人都可以帮忙吗?我将不胜感激任何帮助

4

2 回答 2

1

您缺少后端基础架构。尝试将 7000 个文件作为 Web 请求的一部分加载到数据库中是很疯狂的,该请求应该是短暂的,并且预计某些软件组件以及最终用户只会持续几秒钟或也许一分钟。

相反,为此过程创建一个后端服务和命令和控制。在 Web 应用程序中,将每个要处理的文件名写入数据库表甚至服务器上的纯文本文件,然后告诉最终用户他们的请求已排队并将在接下来的 NN 分钟内处理。然后有一个每 5 分钟(甚至 1 分钟)运行一次的 cron 作业,它会在正确的位置寻找要做的事情,并可以创建成功或失败的报告和/或发送电子邮件以告诉原始请求者它已完成。

于 2013-06-18T01:41:14.987 回答
0

如果打算将其用作导入脚本并且您准备使用 PHP,则最好至少使用 PHP CLI 环境,而不是通过 Web 服务器执行此任务。就目前而言,CSV 文件似乎位于服务器本身,因此我认为没有理由涉及 HTTP。这将避免 Web 请求终止并突然中止导入过程的问题。

为了处理 CSV,我首先查看fgetcsvstr_getcsv。mongoimport命令在验证和清理方面确实做得很少。自己解析 CSV 将允许您跳过缺少字段的记录、在必要时提供默认值或采取其他适当的操作。当您遍历记录时,您可以收集要插入到数组中的文档,然后将结果分批传递给MongoCollection::batchInsert()。驱动程序将负责将大批量拆分为块,以实际以 16MB 的消息通过网络发送(MongoDB 的文档大小限制,这也适用于有线协议通信)。

于 2013-06-24T20:12:39.030 回答