PharData打开一个大型档案

时间:2014-01-20 22:06:52

标签: php large-data

我想在php中打开一个45GB的tar文件和大约500万个文件。我不想提取它。我只想获取单个文件的内容(大约10kb)。

到目前为止,我已经尝试过:

new PharData('tar file');

file_get_contents('phar://file.tar/single file'); 

我收到此错误:

  

致命错误:允许的内存大小为268435456字节耗尽

有没有办法从大型存档中获取单个文件的内容而无需读取整个存档。或者内存较少的东西?

tar -xvf {tarball.tar} {path / to / file}被我的主机禁用

由于

我找到了一些答案,人们说这不能用tar完成。对于tar,您需要阅读整个内容才能提取单个文件。

现在我的问题是,您可以使用什么格式从大型档案中读取单个文件而不加载整个档案。

谢谢

2 个答案:

答案 0 :(得分:1)

  

对于tar,您需要阅读整个内容才能提取单个文件

不正确。但是,使用CLI工具时压缩会增加复杂性。 IIRC,the PEAR tar package可以从gzipped tar档案中提取单个文件,而无需将整个文件读入内存。

为什么需要45Gb存档?是部署吗?如果没有,那么你真的需要考虑一种不同的存储数据或交换提供商的方式。

答案 1 :(得分:0)

尝试使用别名和绝对路径的zip。

$p=new PharData(dirname(__FILE__).'/pharao.zip', 0, 'alias.phar', Phar::GZ);
$p->buildFromDirectory('temp');

如果Phar存在,则不需要新建两次。请致电:

echo file_get_contents('phar://alias.phar/existing.file');

我认为这很快 - 比使用内存交换一百万个文件更快。但是......

file_put_contents('phar://alias.phar/new.file', 'Hello world');

......很慢。因此非常慢,最好像往常一样收集新文件,然后立即添加它们。