2011-10-13 62 views
0

数我有这样一段代码:iTextSharp的花费过多时间在获得页面

foreach(string pdfFile in Directory.EnumerateFiles(selectedFolderMulti_txt.Text,"*.pdf",SearchOption.AllDirectories)) 
{ 
    //filePath = pdfFile.FullName; 
    //string abc = Path.GetFileName(pdfFile); 
    try 
    { 
     //pdfReader = new iTextSharp.text.pdf.PdfReader(filePath); 
     pdfReader = new iTextSharp.text.pdf.PdfReader(pdfFile); 
     rownum = pdfListMulti_gridview.Rows.Add(); 
     pdfListMulti_gridview.Rows[rownum].Cells[0].Value = counter++; 
     //pdfListMulti_gridview.Rows[rownum].Cells[1].Value = pdfFile.Name; 
     pdfListMulti_gridview.Rows[rownum].Cells[1].Value = System.IO.Path.GetFileName(pdfFile); 
     pdfListMulti_gridview.Rows[rownum].Cells[2].Value = pdfReader.NumberOfPages; 
     //pdfListMulti_gridview.Rows[rownum].Cells[3].Value = filePath; 
     pdfListMulti_gridview.Rows[rownum].Cells[3].Value = pdfFile; 
     //totalpages += pdfReader.NumberOfPages; 
    } 
    catch 
    { 
     //MessageBox.Show("There was an error while opening '" + pdfFile.Name + "'", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     MessageBox.Show("There was an error while opening '" + System.IO.Path.GetFileName(pdfFile) + "'", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

问题是,当今天我指定的具有约4000 PDF文件的文件夹,花了约20分钟阅读全部文件并显示结果。然后,我想当我输入一个文件夹超过20,000个文件时,这段代码会做什么。

如果我注释掉这一行:

pdfListMulti_gridview.Rows[rownum].Cells[2].Value = pdfReader.NumberOfPages; 

然后,似乎如果所有的处理负担从代码中删除。

所以,我想从你们那里得到的建议是让我的方法高效,并且应该花费更少的时间处理所有文件。或者有其他的选择吗?

回答

0

个人而言,我会稍微改变你的代码,不要在foreach中调用Directory.EnumerateFiles。例如;

var listOfFiles = Directory.EnumerateFiles(selectedFolderMulti_txt.Text,"*.pdf",SearchOption.AllDirectories); 
foreach(string pdfFile in listOfFiles) 
{ 
//Do something 
} 

我怀疑这会影响大量的整体时间,如果有的话。

至于调用NumberOfPages属性的速度。由于在pdfReader对象的内部,你不可能优化它。如果性能是一个问题,那么这可能需要额外的硬件。我个人并不认为这是一个问题,除非我必须持续运行扫描(在这种情况下,我将开始寻找缓存/检查现有文件,并只添加已更改/新的文件)。

+0

是的,我认为要使性能更好,我将需要额外的硬件。 – booota

1

绝对要做@ChrisBint所说的,它会通过Window缓慢的文件夹来处理很多文件。

但为了获得更高的速度,请务必使用PdfReader的超负荷,而不是使用RandomAccessFileOrArray对象。在我的所有测试中,此对象的速度比普通流快方式。构造函数有几个重载,但你应该主要关心RandomAccessFileOrArray(string filename, bool forceRead)。第二个参数是是否将整个文件加载到内存中(如果我正确理解文档)。对于非常大的文件,这可能会造成性能下降,但在现代机器上应该无关紧要,所以我建议您将true传递给此。如果您通过false,则解析“光标”遍历文件时需要多次点击该磁盘。

因此,所有这一切都可以在一个非常紧密的循环中完成。对我而言,包含总共42,000多页的4,000个文件需要大约2秒的时间才能运行。

 var files = Directory.EnumerateFiles(workingFolder, "*.pdf"); 
     int totalPageCount = 0; 
     foreach (string f in files) 
     { 
      totalPageCount += new PdfReader(new RandomAccessFileOrArray(f, true), null).NumberOfPages; 
     } 
     MessageBox.Show(String.Format("Total Page Count : {0:N0}", totalPageCount)); 
+0

相同的旧处理时间。我想我必须坚持这种情况。我刚刚在代码中添加了“SearchOption.AllDirectories”。 – booota

+0

@booota,我非常非常惊讶。您是否至少运行1或2 GB的RAM?你有没有真正大的PDF,比如超过200MB? –

+0

lols。我有2.5GB RAM的C2D处理器。是的,所有的文件都是9GB左右。单个文件最大为15MB。但是,与另一个文件夹有9 GB文件(数量更多但尺寸更小)的时间稍少一些。第一个文件夹大约。 4000个文件,第二个文件夹大约有16000个文件。我也对约。同时为两个文件夹。我认为它是影响性能的文件大小的问题 – booota