【问题标题】:Start reading large csv at specific row without iterating previous rows开始在特定行读取大 csv 而无需迭代前一行
【发布时间】:2017-01-13 04:52:50
【问题描述】:

我正在尝试读取包含 500 000 行和 81 列的 CSV 文件并将其插入数据库。 CSV 大小为 160 MB

以下是我的代码

$file    = fopen($path, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
}

它工作大约 1 小时,访问大约 100 000 条记录,然后停止处理并显示错误“连接已重置”。我尝试增加 PHP 执行时间限制和内存限制,但这不是一个有效的解决方案。

我可以从特定行开始读取 CSV 而无需遍历之前的行吗?

【问题讨论】:

  • 也许你应该创建一个批处理程序。
  • 它可以在linux服务器上运行吗?
  • 类似this
  • 我已经从你之前的问题中编辑了十万。请使用通用度量而不是印度语。
  • 由于您使用的是 csv,因此您可以使用类似于以下的函数获取 csv 的一部分:stackoverflow.com/posts/22669242/revisions 我不知道它是否对您有很大帮助,但它没有看起来没那么高效。但它可能对你有用。

标签: php laravel-5.3


【解决方案1】:

你需要的神奇功能是fseek()。您可以记下上次结束的位置并继续处理。但是您需要记住,每一行的长度不同,因此在文件中找到正确的位置有点困难。

我建议首先摆脱 CSV。使用具有固定行大小的 Sqlite 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多