在写大数据时保持文件打开?

时间:2014-02-14 16:07:22

标签: php

我们需要将数据导出到csv文件。

方法是:

  1. fopen csv文件一次
  2. x行将数据转储到文件(fputcsv)之后
  3. x = 100, 500 or 1000
  4. fclose在写完所有数据后将其关闭
  5. 30.000行需要大约1分钟来解析并写入文件。

    到目前为止,在100行之后写作是最快的。

    如何加快出口速度?它不是关于我们的数据解析算法,而是文件管理和编写。

    以下是一些相关的代码块:

      // -- path and file creation functions
      $strPhpTmpDir = sys_get_temp_dir();
      $strTmpDir = $strPhpTmpDir . DIRECTORY_SEPARATOR . uniqid();
      $bOk = mkdir($strTmpDir, 0777);
      $this->m_strTmpPath = $strTmpDir;
    
      $strFile = 'csv-' . time() . '-' . rand() . '.csv';
      $this->m_strTmpFile = $this->m_strTmpPath . DIRECTORY_SEPARATOR . $strFile;
    
      touch($this->m_strTmpFile);
    
      // -- open function
      if (is_file($this->m_strTmpFile) && is_writable($this->m_strTmpFile)) {
         $this->m_oFile = fopen($this->m_strTmpFile, 'w');
      }
    
      // -- dump function
      foreach($arData as $arLine) {
         fputcsv($this->m_oFile, $arLine, ';', '"'); 
      }
    

1 个答案:

答案 0 :(得分:1)

如果您对写入间隔进行了修改并发现100是最快的,那么您可能已尽可能多地完成。

如果这是在从shell而不是网页调用的脚本中,则有其他选择。

  • 备选方案1 - 以编译语言而不是解释语言编写导出脚本。 C 1

  • 备选方案2 - 将CSV行输出到stdout并使用重定向将输出管道输入操作系统中的文件

  • 备选方案3 - 如果可能,请查看操作系统中的缓存选项

没有尝试上述任何一项(并且在看到您的代码片段后,选项1被删除了),可能是因为您在创建文件时更接近操作系统而不是更快有PHP循环并执行写作