본문 바로가기
2021-1/Expert

Expert | 2021.12.13(월) Task

by 이망고_ 2021. 12. 23.

지수팀 task

(웹) 통합요청 -> 상혁이 코드(->Domestic) ----keyid, fid----> sh 코드(통합 전문가 지수, 시작점) ---8개로multiprocessing---class---> 전문가지수(토퍼,종훈) -> factorInfo 에 넣으면

 

(웹) 통합요청 <-> factorInfo 

로 가도록 함

그 다음이 정규화

 

[intergratingAnalyzer] 코드

from threading import Thread
import threading
class intergratingAnalyzer(threading.Thread):
    # client =  MongoClient('localhost:27017', connect=False)
    # db = None
    # dt = datetime.datetime.now()

    def __init__(self, _keyId, _fid, _query, _start, _end, _total):
        threading.Thread.__init__(self)
        self.keyId        = _keyId
        self.fid          = _fid
        self.defaultScore = 0.02
        self.start        = _start
        self.end          = _end
        self.total        = _total
        self.query        = _query

    def run(self):
        print("---------------------")
        print(self.start)
        print(self.end)
        print(self.total)
        print("---------------------")

class 함수를 이용해서 intergratingAnalyzer를 만들어 주었다. (필요할 때 import intergratingAnalyzer 해서 사용하면 된다) 클래스 함수 처음 써봄..

class 안에 사용자 지정 함수인 def 사용해주어서 변수를 지정해주었다.

__init__ 함수는 self랑 짝이어서 항시 사용해주고, 최초로 호출을 해준다.

class

   def __init__(self, ..)

 

def run(self):

은 코드를 실행해주는 부분이다. 

start 와 end를 찍어보라고 하셨는데 그게 무슨 뜻인지를 잘 몰랐다.

간단히 run으로 지정해주고 

  print("-------------")

를 해줌으로써 구분을 시켜주고

  print(self.start)

  print(self.end)

를 통해 잘 실행이 되는지 찍어본다

  print(self.total)

  print("--------------") 

로 마무리 잘 돌아가나 확인

(비주얼코드에서 희한하게 막혀서 아톰으로 해주니 코드가 잘 실행이 된다. 아톰에 파이썬 설치하기!)

 

 

[sh.py] 코드

from pymongo import MongoClient
from multiprocessing import Process
import multiprocessing
from intergratingAnalyzer import intergratingAnalyzer


client = MongoClient('203.255.92.141:27017', connect=False)
id = client['ID']
domestic = client['ID']['Domestic']
keyId = 588

authorSize = domestic.count_documents({"fid":0, "keyId" :keyId})

th = 100 # each core handle 100 or more data
sizeDict = {}

cores = multiprocessing.cpu_count()
if cores > 3:
    cores -= 1
perData = int(authorSize / cores)

if perData > th :
    last = 0
    for i in range(cores-1) :
        sizeDict[last] = last+perData
        last += perData
    sizeDict[last] = authorSize
else :
    sizeDict[0] = authorSize

#정규화 초기화 과정 있음.


processList = []
for i in sizeDict :
    acl = intergratingAnalyzer(keyId, 0, "test", i, sizeDict[i], authorSize)

    p = Process(target= acl.run)
    processList.append(p)
    print(p)
    p.start()
    
#기다리는거..    
for p in processList :
    p.join()

import multiprocessing

요 부분도 multiprocessing 이 없다고 하니 바로 import 해주셨다.


from intergratingAnalyzer import intergratingAnalyzer

앞전에 만든 통합분석기를 가져와서(from) import 해주었다.

 

authorSize = domestic.count_documents({"fid":0, "keyId" :keyId})

실행해보니 이 부분에서 에러가 나왔다,

error domestic.count_documents 로 바꾸라고 하니 박사님께서 바로 복붙해서 코드를 수정하셨다.

 

client = MongoClient('203.255.92.141:27017', connect=False) 

해서 몽고db와 연결하고

 

keyId = 588

를 여서 주니 

authorSize = domestic.count_documents({"fid":0, "keyId" :keyId})

여기서 "keyId" :keyId 부분에서 588로 넣어주지 안코, keyId로 넣어주었다. ("fid: " 는 "0"으로 넣어줌)

 

cores = multiprocessing.cpu_count()
if cores > 3:
    cores -= 1
에서는 코어의 갯수로 멀티프로세싱을 해주기 위해서 세어주는 함수를 추가해주었다

코어가 쿼드코어 이상일 경우에는 -1로 해주어서 과부하를 방지한다

 

perData = int(authorSize / cores)

각 페이지에는 멀티프로세싱해준 데이터의 갯수가 들어가도록 int 처리해준다

 

for i in range(cores-1) :

range는 0부터 세어 주기 때문에 실제 갯수보다 -1 해주어서 입력해준다

통합분석기에서 사용자 지정해둔 함수 소환
acl 변수에 통합분석기에서 설정한 변수대로, 지정해둔 값을 대신 입력해준다

processList = []
for i in sizeDict :
    acl = intergratingAnalyzer(keyId, 0, "test", i, sizeDict[i], authorSize)

[]빈리스트로 지정해주고

통합분석기 변수대로, keyId=588로 지정해주어서 그냥 keyId로 넣어주고

fid=0으로 지정해주고 

_query 는 "test"로 지정해주고

_start 는 i

_end 는 sizeDict[i]

_total 은 authorSize 로 넣어준다. 

 

p = Process(target= acl.run)

p가 run 하도록 해주고

 

p.start()

여기가 시작점이다

 

for p in processList :
    p.join()

.join() 함수를 써주는 것은 8개가 나뉘어져서 데이터가 전처리되는데 데이터 읽는 속도가 8개가 다 다를 것이 아닌가

동시에 끝날 때까지 기다려주는 함수가 바로 join 함수다~