我正在尝试对以下代码进行多线程处理,但似乎无法使其正常工作。
以下代码(其中我删除了大部分代码只是为了说明目的)目前运行顺利,但速度很慢(对于 3600 条推文的列表大约需要 5 分钟)。
import dataset
import datetime
import json
with open("postgresConnecString.txt", 'r') as f:
DB_CONNECTIONSTRING = f.readline()
DB = dataset.connect(DB_CONNECTIONSTRING)
def load_tweet(tweet, tweets_saved):
"""Takes a tweet (dictionary) and upserts its contents to a PostgreSQL database"""
try:
data = {'tweet_id': tweet['tweet_id',
'tweet_json': json.dumps(tweet)} # Dictionary that contains the data I need from the tweet
DB['tweets'].upsert(data, ['tweet_id'])
tweets_saved += 1
if tweets_saved % 100 == 0:
print('Saved ' + str(tweets_saved) + ' tweets')
return tweets_saved
except KeyError:
return tweets_saved
if __name__ == "__main__":
tweets['tweet1', 'tweet2']
for tweet in tweets:
tweets_saved = load_tweet(tweet, tweets_saved)
因此,我正在寻找一个选项来执行此多线程操作。但是,我还没有找到一种方法可以:
- 多线程提取过程;
- 每 100、500 或 1000 条推文打印一个计数器;
正在经历本教程 http://www.tutorialspoint.com/python/python_multithreading.htm还没有让我理解这样做:每个线程的类的概念,我需要在类中自定义的内容以及目前实现队列对我来说目前需要掌握很多;我才刚开始。
- 有人可以提供有关如何利用多个线程合并上述脚本的提示吗?
- 我应该使用多少个线程?目前,Python 在运行脚本时使用了约 1% 的 CPU 和约 10% 的 RAM(我的系统规格 http://www.asus.com/Notebooks_Ultrabooks/ASUS_ROG_G750JS/specifications/)
- 我如何处理递增计数器(使用 Lock()?),并在命中计数器 % 100 时进行打印?
编辑:根据要求:以下是分析器结果的重要内容(使用 dataset.upsert):
ncalls tottime percall cumtime percall filename:lineno(function)
5898 245.133 0.042 245.133 0.042 :0(_connect)
5898 12.137 0.002 12.206 0.002 :0(execute)
这是使用“dataset.insert”而不是“dataset.upsert”的第二次尝试:
1386332 function calls (1382960 primitive calls) in 137.255 seconds
ncalls tottime percall cumtime percall filename:lineno(function)
2955 122.646 0.042 122.646 0.042 :0 (_connect)
最后(而且绝对不是最不重要的),这是运行原始 psycopg2 代码的时间。
63694 function calls (63680 primitive calls) in 2.203 seconds
结论是,不要使用数据集来提高性能(尽管编写 psycopg2 代码花了我 10 分钟,>>> 数据集.upsert 的 10 秒)
- 现在,至于原来的问题。通过多线程处理,我是否能够进一步减少每个文件约 2 秒的时间?如何?
完整代码可以找到here https://github.com/MVersteeg/Twitter-Archive-Loader/blob/master/pyTwitter.py