Php 将csv文件缩减为两列的最快方法
我有一个csv文件,其中有30000行。它也有9列。为了加快对所有内容的处理,我希望将文件缩减为所需的两列,并删除其余部分。这就是我所做的Php 将csv文件缩减为两列的最快方法,php,Php,我有一个csv文件,其中有30000行。它也有9列。为了加快对所有内容的处理,我希望将文件缩减为所需的两列,并删除其余部分。这就是我所做的 $retardment=1;//17;// 151; //499;// 991;// 1877 if (($handle = fopen($source, "r")) !== FALSE) { $stock_handle = fopen($source_stock, "w+"); $row=0; $col=array();
$retardment=1;//17;// 151; //499;// 991;// 1877
if (($handle = fopen($source, "r")) !== FALSE) {
$stock_handle = fopen($source_stock, "w+");
$row=0;
$col=array();
while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) {
unset($line[1]);
unset($line[2]);
unset($line[3]);
unset($line[4]);
unset($line[5]);
unset($line[6]);
unset($line[8]);
unset($line[9]);
if($row%$retardment<1){
fputcsv($stock_handle, $line);
}
unset($line);
$row++;
}
fclose($handle);
fclose($stock_handle);
}
$delayment=1//17;// 151; //499;// 991;// 1877
if(($handle=fopen($source,“r”))!==FALSE){
$stock\u handle=fopen($source\u stock,“w+”);
$row=0;
$col=array();
而(($line=fgetcsv($handle,100000,“,”)!==FALSE){
未设置($line[1]);
未设置($line[2]);
未设置($line[3]);
未设置($line[4]);
未设置($line[5]);
未设置($line[6]);
未设置($line[8]);
未设置($line[9]);
如果($row%$delayment您可以将那些unset()
调用替换为
$line = array($line[0], $line[7]);
或者,请记住unset()
接受多个参数
unset($line[1], $line[2], ...);
你可以稍微加快一点,但这也是一个微时间()-可测量的改进:感觉它不会明显加快
while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) {
if($row++ % $retardment < 1){
fputcsv($stock_handle, array($line[0],$line[7]));
}
}
while($line=fgetcsv($handle,100000,“,”)!==FALSE){
如果($row++%$delayment<1){
fputcsv($stock_handle,array($line[0],$line[7]));
}
}
但是由于您的脚本是IO绑定的,所以实际的读写操作是最慢的函数,您无法加快这些操作的速度
使用with a可能是另一种方法,但除非您可以减少磁盘访问时间,否则您不会看到明显的改进为什么不逐行检查文件,找出与您想要的两列相对应的条目,然后将它们写入输出文件?我想,随着内存的释放,它会加快速度。您知道吗在while
循环的每个迭代过程中,我们都将一个新数组分配给$line
,所以内存使用量几乎可以忽略不计。获取您想要的并输出它。不要担心取消设置
会在一个循环中设置一堆您不关心的东西。因此,不使用unset似乎根本不会加快速度。我没有mircoti我检查一下,但它似乎也一样长。我基本上把while循环中的所有内容都减少到fputcsv($stock\u handle,array($line[0],$line[7]));在64位裸骨linux云服务器中的1024gb ram上,速度似乎也一样慢。30K线路大约需要10-15分钟。时间与以前大致相同。现在,我可以在大约1.5分钟内完成同样的任务,从开始到结束,用excel“手工”完成.并不是说我们在这些盒子上做的任何事情都是手工的哈哈…我会试试这个..我希望找到一个“删除列”键入隐藏起来的函数。在实践中,打开excel并删除列,然后将其保存以供此脚本运行会更快。但我不能一直手工操作。lol。这就是上面提到的最终方法中使用的方法。谢谢-因此,在我看来,我虽然只访问了4次文件,但打开读取,写入clos每个文件有两个…但是…考虑一下..fputcsv()正在写入文件,所以最好的方法可能是构建我想要写入的内容并将其存储在内存中,然后一次写入所有内容?可能是吗?
while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) {
if($row++ % $retardment < 1){
fputcsv($stock_handle, array($line[0],$line[7]));
}
}