2014-01-20 50 views
1

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

到目前为止,我曾尝试:

new PharData('tar file'); 

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

我得到这个错误:

Fatal error: Allowed memory size of 268435456 bytes exhausted

有没有办法让一个单个文件从内容没有阅读整个档案的大档案。或者需要较少内存的东西?

焦油-xvf {tarball.tar} {路径/到/文件}是我的主人禁用

感谢

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

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

谢谢

+0

打开45GB得到10KB?在PHP中?伴侣!你的设计中有一些真正的东西...... –

+0

45GB的存档不包含只有一个10Kb的文件...它包含大约5百万个文件。我只想从500万中获得一个文件。 – user1611597

回答

1

For tar you need to read the whole content in order to extract a single file

事实并非如此。但使用CLI工具时,压缩会增加复杂性。 IIRC,the PEAR tar package可以从gzipped tar归档文件中提取单个文件,而无需将整个文件读入内存。

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

+0

$ v_archive-> extractInString('从档案文件的路径');似乎工作。但获取文件需要30秒以上。我将尝试使用zip压缩文件而不进行任何压缩。谢谢您的回答。我只想将一些旧数据存储在共享服务器上。主服务器在ssd上,我没有太多的空间。共享服务器上的问题是我只能拥有25万个文件,因此我试图找到一个很好的解决方案来从档案文件中读取 – user1611597

+0

如果您尝试使用的文件数量有限,那么这是比phar更好的解决方案/ tar文件将是一个数据库 - SQLite?然后你有索引访问的文件。 – symcbean

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'); 

...很慢。所以非常慢,最好像往常一样收集新文件并一次添加它们。