分析 3000 万个海量字符串
在处理大量数据时,遇到“内存不足”错误可能会令人困惑。考虑以下场景:您正在使用curl 检索大约3050 万个字符的CSV 文件。尝试使用常用方法(例如按 r 和 n 进行爆炸)将此数据分解为行数组会触发可怕的内存分配错误。这就提出了一个问题:如何在有效操作大量数据的同时避免此类错误?
避免内存分配错误的策略
正如之前的回复中敏锐指出的:
替代方法:使用自定义流包装器
虽然 CURLOPT_FILE 通过将数据写入文件有效解决了问题,但某些情况下可能需要 -记忆处理。在这种情况下,实现自定义流包装器提供了一个可行的解决方案。
示例流包装器:
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中文网其他相关文章!