2016-06-08 13 views
0
# -*- coding: utf-8 -*- 
from __future__ import print_function 
import os, codecs, re, string, mysql 
import mysql.connector 

'''Reading files with txt extension''' 
y_ = "" 
for root, dirs, files in os.walk("/Users/Documents/source-document/part1"): 
    for file in files: 
     if file.endswith(".txt"): 
      x_ = codecs.open(os.path.join(root,file),"r", "utf-8-sig") 
      for lines in x_.readlines(): 
       y_ = y_ + lines 
#print(tokenized_docs) 

'''Tokenizing sentences of the text files''' 

from nltk.tokenize import sent_tokenize 
raw_docs = sent_tokenize(y_) 

tokenized_docs = [sent_tokenize(y_) for sent in raw_docs] 

'''Removing stop words''' 

stopword_removed_sentences = [] 
from nltk.corpus import stopwords 
stopset = stopwords.words("English") 
for i in tokenized_docs[0]: 
    tokenized_docs = ' '.join([word for word in i.split() if word not in stopset]) 
    stopword_removed_sentences.append(tokenized_docs) 

''' Removing punctuation marks''' 

regex = re.compile('[%s]' % re.escape(string.punctuation)) #see documentation here: http://docs.python.org/2/library/string.html 
nw = [] 
for review in stopword_removed_sentences: 
    new_review = '' 
    for token in review: 
     new_token = regex.sub(u'', token) 
     if not new_token == u'': 
      new_review += new_token 
    nw.append(new_review) 

'''Lowercasing letters after removing puctuation marks.''' 

lw = [] #lw stands for lowercase word. 
for i in nw: 
    k = i.lower() 
    lw.append(k) 

'''Removing number with a dummy symbol''' 
nr = [] 
for j in lw: 
    string = j 
    regex = r'[^\[\]]+(?=\])' 
# let "#" be the dummy symbol 
    output = re.sub(regex,'#',string) 
    nr.append(output) 
nrfinal = []  
for j in nr: 
    rem = 0 
    outr = '' 
    for i in j: 
     if ord(i)>= 48 and ord(i)<=57: 
      rem += 1 
      if rem == 1: 
       outr = outr+ '#' 
     else: 
      rem = 0    
      outr = outr+i 
    nrfinal.append(outr) 

'''Inserting into database''' 
def connect(): 
    for j in nrfinal: 
     conn = mysql.connector.connect(user = 'root', password = '', unix_socket = "/tmp/mysql.sock", database = 'Thesis') 
     cursor = conn.cursor() 
     cursor.execute("""INSERT INTO splitted_sentences(sentence_id, splitted_sentences) VALUES(%s, %s)""",(cursor.lastrowid,j)) 
     conn.commit() 
     conn.close() 
if __name__ == '__main__': 
    connect() 

Ich bekomme keinen Fehler mit diesem Code. Es ist gut für die Textdateien. Das Problem ist nur die Ausführungszeit, da ich viele Textdateien (fast 6 GB) habe, für die das Programm zu viel Zeit benötigt. Bei der Überprüfung stellte ich fest, dass es CPU-gebunden ist. Um es zu lösen, wird Multiprocessing benötigt. Bitte helfen Sie mir, meinen Code mit Multiprocessing-Modul zu schreiben, so dass eine parallele Verarbeitung möglich ist. Danke euch allen.Wie können wir das Programm mit dem Multiprocessing-Modul von Python schreiben?

+0

Bevor Sie Multi-Processing verwenden - Refactor Ihren Code suchen Schwächen. – Merlin

+0

Da der Code funktioniert, post auf http://codereview.stackexchange.com/ – Merlin

+0

@Merlin das OP fragt nach Code noch nicht geschrieben, daher ist es off Thema auf CR – Heslacher

Antwort

1

gibt es ein Beispiel, bei dem python docs, die die Verwendung von multiprocessing zeigt:

from multiprocessing import Pool 
def f(x): 
    return x*x 

if __name__ == '__main__': 
    with Pool(5) as p: 
     print(p.map(f, [1, 2, 3])) 

Sie dies Ihren Code anpassen können. Sobald Sie die Textdateien erhalten haben, verwenden Sie die Funktion map, um den Rest parallel auszuführen. Sie müssten eine Funktion definieren, die den Code kapselt, den Sie auf mehreren Kernen ausführen möchten.

Das parallele Lesen von Dateien kann jedoch die Leistung beeinträchtigen. Auch das asynchrone Hinzufügen von Inhalt zur Datenbank funktioniert möglicherweise nicht. So können Sie diese beiden Aufgaben im Haupt-Thread ausführen, noch