2014-02-05 4 views
1

Мне недавно сказали мои vps, поскольку мой скрипт python использовал слишком много процессора (очевидно, скрипт использовал весь ядро ​​в течение нескольких часов).простой скрипт python с использованием слишком большого количества cpu

мой сценарий использует библиотеку twython, чтобы поток твитов

def on_success(self, data): 

    if 'text' in data: 
     self.counter += 1 
     self.tweetDatabase.save(Tweet(data)) 

     #we only want to commit when we have a batch 
     if self.counter >= 1000: 
      print("{0}: commiting {1} tweets".format(datetime.now(), self.counter)) 
      self.counter = 0 
      self.tweetDatabase.commit() 

Tweet класс, это работа, чтобы выбросить мета-данные о твиттере мне не нужно:

class Tweet(): 

    def __init__(self, json): 

     self.user = {"id" : json.get('user').get('id_str'), "name" : json.get('user').get('name')} 
     self.timeStamp = datetime.datetime.strptime(json.get('created_at'), '%a %b %d %H:%M:%S %z %Y') 
     self.coordinates = json.get('coordinates') 
     self.tweet = { 
         "id" : json.get('id_str'), 
         "text" : json.get('text').split('#')[0], 
         "entities" : json.get('entities'), 
         "place" : json.get('place') 
        } 

     self.favourite = json.get('favorite_count') 
     self.reTweet = json.get('retweet_count') 

также имеет a __str__, который вернет суперкомпактное строковое представление объекта

tweetDatabase.commit() просто сохраняет твиты в файл, а t он tweetDatabase.Save() просто сохраняет чириканье в список:

def save(self, tweet): 
    self.tweets.append(tweet.__str__()) 

def commit(self): 
    with open(self.path, mode='a', encoding='utf-8') as f: 
     f.write('\n'.join(self.tweets)) 

    self.tweets = [] 

Что лучший способ держать на низком уровне центрального процессора? если я сплю, я потеряю твиты, так как это будет время, когда программа будет потрачена не на прослушивание twitters api. Несмотря на это, я пробовал спать в течение секунды после того, как программа записывает в файл, однако это ничего не делало, чтобы свести процессор. Для сохранения записи в файл каждые 1000 твитов чуть больше минуты.

большое спасибо

+0

Вы должны просмотреть свой код и найти, где находятся горячие точки. Возможно, вам нужна СУБД здесь вместо файла открытого текста ... –

+1

Возможно, вы захотите попробовать переключиться на PyPy, который предлагает быстрый JIT – nodakai

ответ

1

Попробуйте проверить, нужно ли сначала совершить транзакцию on_success(). Затем проверьте, есть ли у твита данные, которые вы хотите сохранить. Вы также можете захотеть рассмотреть условия гонки на переменной self.counter и, вероятно, должны иметь обновление для self.count, которое будет обернуто в мьютекс или что-то подобное.

1

Вы можете попробовать профилирование программу с

import cProfile 
command = """<whatever line that starts your program>""" 
cProfile.runctx(command, globals(), locals(), filename="OpenGLContext.profile") 

, а затем просмотра OpenGLContext.profile с RunSnakeRun (http://www.vrplumber.com/programming/runsnakerun/)

Чем больше блок-, тем больше процессорного времени эта функция принимает. Это поможет вам точно определить, какая часть вашей программы занимает много CPU.

Смежные вопросы