php - 如何在不受内存限制的情况下在php中读取大文件
问题描述
我正在尝试逐行读取文件。问题是文件太大(超过 500000 行),我达到了内存限制。我想知道如何在不受内存限制的情况下读取文件。
我正在考虑解决方案多线程(例如将文件拆分为较小的组(每组 100000 行)并在多线程中读取它),但我不知道如何详细执行。请帮助我(抱歉英语不好)。
这是我的代码
$fn = fopen("myfile.txt", "r");
while(!feof($fn)) {
$result = fgets($fn);
echo $result;
}
fclose($fn);
解决方案
您可以使用生成器来处理内存使用情况。这只是用户在文档页面上编写的示例:
function getLines($file)
{
$f = fopen($file, 'r');
try {
while ($line = fgets($f)) {
yield $line;
}
} finally {
fclose($f);
}
}
foreach (getLines("file.txt") as $n => $line) {
// insert the line into db or do whatever you want with it.
}
生成器允许您编写使用 foreach 迭代一组数据的代码,而无需在内存中构建数组,这可能会导致您超出内存限制,或者需要大量的处理时间来生成。相反,您可以编写一个与普通函数相同的生成器函数,不同之处在于生成器不是返回一次,而是生成器可以根据需要多次生成以提供要迭代的值。
推荐阅读
- mysql - 部署mysql不采用秘密设置的root密码
- python - 子进程和 Python 我做错了什么?
- c# - 将带有命名空间的 XML 转换为 C# 模型类
- python - 如何使用 moto,@mock_dynamodb2 模拟失败的操作?
- django - 强制 Django 将模型字段值识别为模板标签值?
- c++ - 提升二进制反序列化
- vue.js - 如何使 Vue.js 3 中动态生成的按钮不执行相同的功能
- sqlalchemy - FastAPI / SQLAlchemy 创建多个用户
- filter - 获取每个客户的第一个购买日期
- javascript - 如何列出 Firestore 文档的所有子集合?