- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们遇到了一些奇怪的问题。它是这样的。我们有大量数据需要输出给客户端。这些数据文件不能预先构建,它们必须由实时数据提供。
我的首选解决方案是像这样从提取中逐行写入 CSV:
while($datum = $data->fetch(PDO::FETCH_ASSOC)) {
$size += fputcsv($outstream, $datum, chr(9), chr(0));
}
这解决了很多荒谬的内存使用问题(一次将 100000 条记录读入内存是一种糟糕的做法),但我们仍然存在大型表的挥之不去的问题,随着数据大小的增加,这些问题只会变得更糟。请注意,没有数据分区;他们不按年分段下载,但他们下载所有数据,然后自己分段。这是根据要求;我无法对此进行尽可能多的更改,因为它可以完全解决问题。
在任何一种情况下,它都会在最大的表上耗尽内存。一种解决方案是增加可用内存,这解决了一个问题,但如果有多个客户端正在下载,则建议稍后甚至现在创建服务器负载问题。
在这种情况下,$outstream 是:
$outstream = fopen("php://output",'w');
这看起来很明显不是真正的物理磁盘位置。我不太了解 php://output 就数据在发送到客户端之前所在的位置而言,但很明显,通过这种方法将流形数据库表简单地写入 csv 存在内存问题。
确切地说,暂存框允许 PHP 使用大约 128mb,而这个调用尤其短了大约 40mb(它试图再分配 40mb。)这看起来有点奇怪,因为您会期望它要求内存分成更小的部分。
有人知道如何处理这个问题吗?
最佳答案
所以看起来内存消耗是由 Zend Framework 的输出缓冲引起的。我想出的最佳解决方案是这个。
在我们开始将文件流式传输到客户端之前执行 ob_end_clean()。 ZF 的这个特定实例不会产生任何正常输出,也不会在此之后执行任何操作,因此不会出现复杂情况。奇怪的事情发生了(也许从用户的角度来看)是他们真的得到了流式传输给他们的文件。
代码如下:
ob_end_clean();
while($datum = $data->fetch(PDO::FETCH_ASSOC)) {
$size += fputcsv($outstream, $datum, chr(9), chr(0));
}
内存使用量(根据某处 ZF 论坛帖子中建议的函数 memory_get_peak_usage(true))从 90 兆字节下降到 9 兆字节,这是我的开发箱在读取任何文件之前使用的内存。
谢谢大家的帮助!
关于PHP 使用 fputcsv 到 php ://output 时减少内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215129/
这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件。 复制代码代码如下: // 输出Excel文件头,可把user.csv换成你要的文件名
使用此代码,我创建了 CSV 导出文件: foreach ($data_for_export as $row) { $data = []; array_push($data, $row
我在使用 fputcsv 导出 CSV 文件时遇到一些问题。文件已下载,但内容为空。我尝试导出到 xls,它工作得很好,但我想使用带有自定义字段标题的 csv,如下面的代码所示。我不确定我是否做错了什
我有这段 PHP 代码,旨在从 mySQL 数据库检索数据,并将其导出到 CSV 文件,该文件在创建后必须自动下载。 $connection = mysqli_connect($host, $user
我有一个加密和存储用户条目的表单。然后,我有一个导出功能,允许管理员解密并导出所有条目的 csv。 它解密得很好,如果我将数组打印到页面上,一切看起来都很好,但是当我生成 CSV 时,它会在一些数据后
我正在使用这个 fputcsv 代码: $result = mysql_query('SELECT * FROM `mash`'); if (!$result) die('Couldn\'t fetc
我正在使用 PHP 脚本从结果集查询生成 Excel CSV 文件。一切正常,但当我读取我的 excel 文件时,我无法显示前导零。 这是我的代码: $rows = $this->Query($sql
我正要提出与此处提出的问题相同的问题.... Forcing fputcsv to Use Enclosure For *all* Fields 问题是 When I use fputcsv to w
我想将我的 mysql 数据库的部分(和不同排列)保存在 CSV 文件中。为此,我写了这段代码: $headerDisplayed = false; foreach ($arr as &$currNa
我正在开始一个项目,该项目需要我获取多个数组并将它们放入一个 csv 文件中。然而,虽然它正在生成文件,但它通常是完全空的(0 b 文件大小)。有时,如果我遗漏了什么,它会将错误消息放入文件中,或者有
这一定很简单...按照这里和 php.net 上的示例,我尝试从 mysql 查询中获取记录,将它们转换为 csv 格式,并将此数据分配给变量以供程序使用我创造了。我想在不创建临时文件的情况下完成此操
我用 fputcsv 生成 csv 文件,它工作得很好,但是当我在记事本 (Windows) 中查看 csv 文件时,没有新行。所有行都只有 1 行,在应该换行的地方有一个正方形(损坏的字符)。例如,
所以我正在尝试使用 fputcsv,它可以正常工作,几乎就像它的意图一样。我有这个奇怪的问题,我似乎无法解决,而且我找不到任何好的文档,甚至找不到遇到这个问题的人。 当有一个字符串被放入 csv 中时
我在 PHP 中使用 fputcsv 输出数据库查询的逗号分隔文件。在 Ubuntu 的 gedit 中打开文件时,它看起来是正确的——每条记录都有一个换行符(没有可见的换行符,但你可以看出每条记录是
所以我有一行我想对其执行 fputcsv,它有一些整数(我需要将其视为字符串,但它们是数字)。这些整数有前导零,当我执行 fputcsv 时它们会被截断,但我不希望这种情况发生,有什么办法可以解决这个
我一直在使用 PHP 脚本从使用 MySQL 查询的表中导出一些数据,然后想从表中删除这些数据。下面的脚本将数据导出到 CVS 文件。到目前为止它工作正常,但我想添加一个条件来知道如果所有数据都已成功
我正在寻找一种即时导出到 csv 的方法并遇到了这个问题。 $list = array ( array('aaa', 'bbb', 'ccc', 'ddd
未在 csv 文件中输出任何内容。请帮忙!! 这个print_r($list)。 以正确的格式输出数据库中的所有内容但是当我尝试将其放入csv文件中时,仅输出一行。 $sql = "select *
我想将数据从数据库导出到 CSV 文件。 我的PHP代码是这样的 $members = Db::getResult('select * from '.MEMBERS_TABLE_NAME.' orde
嘿,我正在尝试使用数组中的值填充 csv。我怎样才能做到这一点? $sql = "SELECT accountNumber, Name,studentManager,contract,
我是一名优秀的程序员,十分优秀!