首页 > 后端开发 > php教程 > 如何在不耗尽内存的情况下处理3000万个海量字符串?

如何在不耗尽内存的情况下处理3000万个海量字符串?

Barbara Streisand
发布: 2024-11-12 05:11:01
原创
725 人浏览过

How to Process a Massive 30 Million Character String Without Running Out of Memory?

分析 3000 万个海量字符串

在处理大量数据时,遇到“内存不足”错误可能会令人困惑。考虑以下场景:您正在使用curl 检索大约3050 万个字符的CSV 文件。尝试使用常用方法(例如按 r 和 n 进行爆炸)将此数据分解为行数组会触发可怕的内存分配错误。这就提出了一个问题:如何在有效操作大量数据的同时避免此类错误?

避免内存分配错误的策略

正如之前的回复中敏锐指出的:

  1. 避免将整个数据集存储在内存: 尝试将整个 3000 万个字符串加载到内存中本质上是不切实际的。
  2. 利用 CURLOPT_FILE: 另一种方法是使用curl 的 CURLOPT_FILE 选项将数据直接定向到文件,无需中间存储即可实现实时处理

替代方法:使用自定义流包装器

虽然 CURLOPT_FILE 通过将数据写入文件有效解决了问题,但某些情况下可能需要 -记忆处理。在这种情况下,实现自定义流包装器提供了一个可行的解决方案。

  1. 流包装器实现:定义一个定义stream_open()和stream_write()方法的流包装器类。
  2. 动态行提取:在stream_write()中,利用explode("n")来当数据块到达时将行与数据块隔离,为从先前块中继承的不完整行维护一个缓冲区。
  3. 执行处理:对stream_write()中提取的行进行必要的处理。这可能涉及验证、过滤数据或将数据插入数据库。

示例流包装器:​​

class MyStream {
    protected $buffer;

    function stream_open($path, $mode, $options, &$opened_path) {
        return true;
    }

    public function stream_write($data) {
        $lines = explode("\n", $data);
        $lines[0] = $this->buffer . $lines[0];
        $this->buffer = $lines[count($lines)-1];
        unset($lines[count($lines)-1]);

        // Perform your processing here
        var_dump($lines);
        echo '<hr />';

        return strlen($data);
    }
}
登录后复制

注册流包装器:

stream_wrapper_register("test", "MyStream");
登录后复制

与 Curl 结合:

// Configure curl using CURLOPT_FILE
curl_setopt($ch, CURLOPT_FILE, fopen("test://MyTestVariableInMemory", "r+"));

// Execute curl to retrieve data from the source
curl_exec($ch);

// Close the stream
fclose($fp);
登录后复制

通过使用自定义流包装器,您可以在可管理的块中处理大型数据集,而无需遇到内存分配错误。此方法允许在数据到达时对其进行处理,确保有效的内存利用。

以上是如何在不耗尽内存的情况下处理3000万个海量字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板