2017-06-25 13 views
0

私は絶対的な初心者です。私は、例を類推することによって、コードを通して私のやり方をうなずきます。だから、用語の誤用については謝ります。 Python3マルチプロセッシング

  • は、それぞれのページをオン

    • は、PDFファイルのために(自分のコンピュータ上のフォルダ)
    • 検索フォルダをユーザの入力を取ります。私のpython 3に小さなコードを書かれている

      PDFを連続した番号付けを伴う画像に変換する。番号を付けた順にjpgを繰り返し、白黒にします。 OCRはファイルをスキャンしてテキストをオブジェクトに出力し、テキストの内容を.txtファイルに保存します(pytesseract経由)。 jpgを削除し、.txtファイルを残します。ほとんどの時間はjpgに変換され、可能であれば白黒になります。

    コードは機能しますが、改善できると確信しています。しばらく時間がかかり、Poolsを使ってマルチプロセッシングを試してみると思いました。

    私のコードはプールを作成するようです。私はまた、フォルダ内のファイルのリストを印刷する関数を取得することができますので、リストがある形式または別の形式で渡されているように見えます。

    私はそれを動作させることができず、さまざまなエラーで繰り返しコードをハッキングしました。私は主な問題は、私は無知だと思う。

    私のコードが始まります

    ユーザ入力ブロックを(それが有効なフォルダなどでチェックし、ユーザーのディレクトリ内のフォルダを要求します)。関数としてループブロックについて

    関数としてOCRブロックが(単一.txtファイルにコンテンツを出力し、次にPDFを解析)

    (フォルダ内の各PDFの上にループになって、その上にOCRのブロックを実行する。

    (はループブロックにディレクトリ内のファイルのリストを供給することになっている

    マルチプロセッシングブロックは

    戦争と平和を書く避けるために、私は以下のループブロックとマルチプロセッシングブロックの最後のバージョンを設定します。

    #import necessary modules 
    
    
    home_path = os.path.expanduser('~') 
    
    #ask for input with various checking mechanisms to make sure a useful pdfDir is obtained 
        pdfDir = home_path + '/Documents/' + input('Please input the folder name where the PDFs are stored. The folder must be directly under the Documents folder. It cannot have a space in it. \n \n Name of folder:') 
    
    
    
    
    def textExtractor(): 
        #convert pdf to jpeg with a tesseract friendly resolution 
    
        with Img(filename=pdf_filename, resolution=300) as img: #some can be encrypted so use OCR instead of other libraries 
    
        #various lines of code here 
    
        compilation_temp.close() 
    
    def per_file_process (subject_files): 
    
         for pdf in subject_files: 
    
          #decode the whole file name as a string 
          pdf_filename = os.fsdecode(pdf) 
    
          #check whether the string ends in .pdf 
    
         if pdf_filename.endswith(".pdf"): 
    
          #call the OCR function on it 
          textExtractor() 
    
    
         else: 
          print ('nonsense') 
    
    
    if __name__ == '__main__': 
    
        pool = Pool(2) 
    
        pool.map(per_file_process, os.listdir(pdfDir)) 
    

    私の間違いを指摘してくれる人はいらっしゃいますか?

    作業しながら、コードの関連ビット:

    #import necessary 
    
    home_path = os.path.expanduser('~') 
    
    #block accepting input 
    
        pdfDir = home_path + '/Documents/' + input('Please input the folder name where the PDFs are stored. The folder must be directly under the Documents folder. It cannot have a space in it. \n \n Name of folder:') 
    
    
    
    def textExtractor(): 
        #convert pdf to jpeg with a tesseract friendly resolution 
    
        with Img(filename=pdf_filename, resolution=300) as img: #need to think about using generic expanduser or other libraries to allow portability 
        #various lines of code to OCR and output .txt file 
        compilation_temp.close() 
    
    
    subject_files = os.listdir(pdfDir) 
    for pdf in subject_files: 
         #decode the whole file name as a string you can see 
         pdf_filename = os.fsdecode(pdf) 
         #check whether the string ends in /pdf 
         if pdf_filename.endswith(".pdf"): 
          textExtractor() 
    
         else: 
          #print for debugging 
    
  • +0

    ここで解決策がマルチプロセッシングの場合はわかりません。私は 'textExtractor()'が何をしているのか、そして仕上げるのに時間がかかっているのは何であるのか分かりません。 – direprobs

    +0

    'textExtractor'は処理するPDFをどのように知っていますか? 1つのpdfを1つのテキストファイルに変換しますか? – tdelaney

    +0

    こんにちは。答える時間をとってくれてありがとう。必要に応じてコード全体を列挙することができますが、現在エラーを投げているものに焦点を当てる方が簡単だと考えています。 textExtractorはImg(ファイル名= pdf_filename、解像度= 300)を「img:」として開始します。「目的をより良く説明するために編集した質問があります。 – WillMason

    答えて

    1

    Pool.mapos.listdirによって返されたそれぞれの名前で繰り返しワーカー関数を呼び出します。 per_file_processでは、subject_filesは単一のファイル名であり、for pdf in subject_files:は名前の個々の文字を列挙しています。さらに、listdirはサブディレクトリなしでベース名のみを表示するので、pdfの正しい場所を探しているわけではありません。 globを使用すると、拡張名でフィルタリングし、ファイルへの現用パスを返すことができます。

    あなたの例は混乱しています... textExtractor()はパラメータを取りませんので、処理中のファイルをどのように知ることができますか?私は手足の外に出て、ファイル処理の道を実際に取っていると仮定しています。もしそうなら、あなたはpdfのディレクトリにmap経由でそれを与えるだけで簡単に並列化することができます。処理時間がpdfで変わると仮定すると、chunkksizeを1に設定しています。これにより、早期の仕上げ作業者が余分なファイルを処理できるようになります。

    from glob import glob 
    import os 
    from multiprocessing import Pool 
    
    def textExtractor(pdf_filename): 
        #convert pdf to jpeg with a tesseract friendly resolution 
        with Img(filename=pdf_filename, resolution=300) as img: #some can be encrypted so use OCR instead of other libraries 
    
         #...various lines of code here 
        compilation_temp.close() 
    
    if __name__ == '__main__': 
        #pdfDir is the folder inputted by user 
        with Pool(2) as pool: 
         # assuming call signature: textExtractor(path_to_file) 
         pool.map(textExtractor, 
          (filename for filename in glob(os.path.join(pdfDir, '*.pdf')) 
          if os.path.isfile(filename)) 
          chunksize=1) 
    
    +0

    あなたの答えはうまくいくはずですが、最初に試したときにいくつかのエラーが発生しました。私は私の元の関数の2番目を取り除き、最初の関数の最初の行にパラメータを追加する必要があると仮定しています。重要な場合は、元のコードを追加しました。さもなければ、私は離れてあなたの例を見つけようとします。私はそれが働いたら、私は解決としてマークします。ヘルプをよろしくお願いいたします。 – WillMason

    +0

    はい、元の機能は何もしませんでした。「glob」はあなたのためにやっていないし、起動するためのバグを持っていたので完全に削除することができます。私は必要なパラメータを持つサンプル 'textExtractor()'を追加しました。メインコードでは、 'glob'は.pdfファイルのリストを取得します。ファイル名はfilenameで、通常のファイルを確認するためにチェックされ、' map'はファイル名を実行するワーカープロセスに配布します'textExtractor'です。このプールは2サイズしかありませんが、速度はほぼ倍増しています(ディスクI/Oが少し減ります)。 – tdelaney

    関連する問題