Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 获取页数可能会花费太多时间_Performance_Pdf_C# 4.0_Itextsharp - Fatal编程技术网

Performance 获取页数可能会花费太多时间

Performance 获取页数可能会花费太多时间,performance,pdf,c#-4.0,itextsharp,Performance,Pdf,C# 4.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 i

我有一段代码:

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分钟。然后,我想当我输入一个包含20000多个文件的文件夹时,这段代码会做什么

如果我注释掉这一行:

pdfListMulti_gridview.Rows[rownum].Cells[2].Value = pdfReader.NumberOfPages;
然后,似乎所有的处理负担都从代码中移除了


所以,我想从你们这里得到一个建议,让我的方法更有效,并且减少处理所有文件的时间。或者有其他选择吗?

就我个人而言,我会稍微更改您的代码,不调用foreach中的Directory.enumerate文件。比如,

var listOfFiles = Directory.EnumerateFiles(selectedFolderMulti_txt.Text,"*.pdf",SearchOption.AllDirectories);
foreach(string pdfFile in listOfFiles)
{
//Do something
}
我怀疑这会对整个时间造成巨大的影响,如果有的话

至于调用NumberOfPages属性的速度。您不太可能对此进行优化,因为它是pdfReader对象的内部。如果性能是一个问题,那么这可能需要额外的硬件


就我个人而言,我不会将此视为一个问题,除非我必须持续运行扫描(在这种情况下,我会开始查看缓存/检查现有文件,只添加那些已更改/新的文件)。

一定要按照@ChrisBint所说的做,这将克服Window处理包含许多文件的文件夹的缓慢性

但是为了获得更高的速度,请确保使用
PdfReader
的重载,该重载使用
randomAccessFileOrray
对象。在我所有的测试中,这个对象比常规流快得多。构造函数有几个重载,但您应该主要关注
RandomAccessFileOrArray(字符串文件名,bool forceRead)
。第二个参数是是否将整个文件加载到内存中(如果我正确理解了文档)。对于非常大的文件,这可能会影响性能,但在现代机器上,这应该无关紧要,因此我建议您将
true
传递给此。如果传递
false
,则在解析“游标”遍历文件时,需要多次命中磁盘

有了这些,你可以在一个非常紧密的循环中完成这项工作。对我来说,4000个文件总共包含42000多页,运行大约需要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));

相同的旧处理时间。我想我必须坚持这种情况。我刚刚在您的代码中添加了“SearchOption.AllDirectory”。@booota,我非常非常惊讶。您是否使用至少1或2 GB的RAM运行?你有没有真正大的PDF,比如说超过200MB的?哈哈。我有2.5GB内存的C2D处理器。是的,所有的文件都是9GB左右。单个文件的最大容量为15MB,但与另一个文件夹的最大容量为9GB的文件(数量较多,但大小较小)相比,它的时间要少一些。第一个文件夹约有4000个文件,第二个文件夹约有16000个文件。我也很惊讶两个文件夹的时间都差不多。我认为这是一个影响性能的文件大小的问题,它对我来说绝对更快。谢谢。是的,我想为了提高性能,我需要额外的硬件。