Предостережение: я около года учу себя, как писать код в качестве дополнения к работе, поэтому, пожалуйста, не рвитесь ко всему этому;Я знаю, что это не здорово.
В любом случае, я пытаюсь написать код для загрузки pdf с примерно 1500000 веб-страниц, которые поднимаются по порядку на одно целое число, а затем извлекают текст только из тех, которые содержат определенные ключевые слова.Я удалю некоторые из следующих имен, но я получил это для работы с многопоточностью (я использую Oracle VirtualBox и 10 ядер с моей машины), и он может обрабатывать около 25 в минуту, но это займет у меняоколо 41 дня, что в принципе невозможно.Нужна помощь, чтобы сделать этот код более быстрым, чтобы я мог сделать это за разумное время.Любая помощь будет оценена.
Другие примечания: не все файлы при переборе веб-сайтов на самом деле представлены в формате pdf, а некоторые веб-страницы просто пусты.Кроме того, я взял много этого от других людей, так что, вероятно, здесь много бесполезного кода.Я создал файл (costSummary.txt), который собирает серийный номер рассматриваемого элемента и стоимость этого элемента, и его, вероятно, можно оптимизировать.
#Load libraries
from wand.image import Image as Img
import requests
from PIL import Image
import pytesseract
import cv2
import os
from os import path
from os import listdir
from os import stat
import multiprocessing as multi
import numpy as np
import sys
#Create function to extract the information
def webIterate():
myfile = open('costSummary.txt', 'w')
for i in range(20):
id = 4766120 + i
image_url = 'http://website{}.pdf'.format(id)
r = requests.get(image_url, stream = True)
with open('python{}.pdf'.format(id), 'wb') as pdf:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
pdf.write(chunk)
if stat('python{}.pdf'.format(id)).st_size > 0:
with Img(filename='python{}.pdf'.format(id), resolution = 300) as img:
img.compression_quality = 99
img.save(filename='sample_scan{}.jpg'.format(id))
if path.exists('sample_scan{}-0.jpg'.format(id)):
os.rename('sample_scan{}-0.jpg'.format(id), 'sample_scan{}.jpg'.format(id))
text = ''
if stat('sample_scan{}.jpg'.format(id)).st_size > 0:
text = pytesseract.image_to_string(Image.open('sample_scan{}.jpg'.format(id)))
if stat('python{}.pdf'.format(id)).st_size == 0:
text = ''
if (text.find('HORIZONTAL WELL') == -1):
text = ''
for item in text.split('\n'):
if 'SERIAL' in item:
sn = item.strip()
for item in text.split('\n'):
if '$' in item:
capex = item.strip()
myfile.write('%s\n' % sn)
myfile.write('%s\n' % capex)
test = os.listdir('/home/myDirectory')
for item in test:
if item.endswith('{}.jpg'.format(id)):
os.remove(item)
elif item.endswith('{}.pdf'.format(id)):
os.remove(item)
else:
test = os.listdir('/home/myDirectory')
for item in test:
if item.endswith('{}.jpg'.format(id)):
os.remove(item)
elif item.endswith('{}.pdf'.format(id)):
os.remove(item)
myfile.close()
file_name = multi.current_process().name +'.txt'
test = os.listdir('/home/myDirectory')
for item in test:
if item.endswith('.jpg'):
os.remove(item)
elif item.endswith('.pdf'):
os.remove(item)
cpus = multi.cpu_count()
workers = []
for cpu in range(cpus):
sys.stdout.write('CPU' + str(cpu) + '\n')
worker = multi.Process(name = str(cpu),
target = webIterate,
args = ())
worker.start()
workers.append(worker)
for worker in workers:
worker.join()