2

所以我有一个脚本,可以将 CSV 文件导入到数据库中的联系人表中。

我制作了一个脚本,它会抓取一大块 CSV 文件并对其进行处理,用它的进度更新一个队列表,然后使用 cron 定期运行它,这样它基本上可以处理任何大小的文件。

无论如何,我将它限制为一次只能运行 1000 行,以防止它翻倒。这工作得很好,但我有人尝试上传一个比平常更多的字段的 CSV,这意味着 CSV 的 1 行比平常大得多。

当我将数据传递给函数以构建查询以将其放入数据库时​​,在修剪查询时 substr() 函数出现“内存不足”错误。

$q = substr($q, 0, -1);

在脚本的这一点上,$q 变得相当大,这似乎正在扼杀它。知道如何在不将整个 var 加载到内存中的情况下砍掉最后一个字符吗?除了使批量更小之外?

4

2 回答 2

3

@Horse:如果你知道这个角色会是什么,你可以试试

$q = rtrim($q, ","); // if it is a comma, for instance

否则,您可以查看是否遇到相同的错误

$q = mb_substr($q, 0, -1);

或者

$q = substr_replace($q, "", -1)
于 2011-03-11T14:09:51.423 回答
2

许多 PHP 文件函数带有一个length参数,该参数将限制函数读取的文本量。也许您可以将其设置为比预期输入大小长但比行长短的值,这会导致内存错误。

否则,请仔细查看您的代码,并确保在您的循环中您没有构建任何大型变量或内存泄漏。如果你有问题,不看你的代码是不可能知道的。但是,如果您将所有变量都保留在循环范围内,那么您真的不应该因为一行而出现内存问题。那条线将是绝对巨大的。

当然,你总是可以增加你的内存限制。那将是最容易做的事情。

最后,我的经验是,内存限制错误报告的行几乎从来都不是真正的罪魁祸首。这只是发生错误的那一行。问题通常出现在代码的早期,并且比其他任何东西都更具算法性。所以我不会太专注于那个 substr() 调用。处理您的整体内存使用情况。

于 2011-03-11T14:03:10.433 回答