我想在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,您需要阅读整个内容才能提取单个文件。
现在我的问题是,您可以使用什么格式从大型档案中读取单个文件而不加载整个档案。
谢谢
答案 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');
......很慢。因此非常慢,最好像往常一样收集新文件,然后立即添加它们。