如何多线程从列表中读取字典并输入数据库

2024-05-12

我正在尝试对以下代码进行多线程处理,但似乎无法使其正常工作。

以下代码(其中我删除了大部分代码只是为了说明目的)目前运行顺利,但速度很慢(对于 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


有几点可以改进:

在单个事务上运行整个批次。使用事务意味着数据库不需要在每次写入时实际提交(将数据写入磁盘),而是可以在内存上缓冲未提交的数据。这通常会导致更有效的资源利用。

在tweet_id上添加唯一索引。如果没有唯一索引,您可能会强制数据库对每个 upsert 执行顺序扫描,这会导致批量 upsert 扩展为 O(n**2)。

拆分插入和更新,尽可能使用 .insert_many() 而不是 .upsert()。在进行批量更新插入之前,您需要执行预检查询以找出数据库和推文列表中都存在的 tweet_ids 列表。使用 .insert_many() 插入数据库中尚不存在的项目,并使用普通 .update() 插入数据库中已存在的项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何多线程从列表中读取字典并输入数据库 的相关文章

  • 如何打印前面有一定数量空格的整数?

    C has printf Xd Y 它只打印整数 X 并使其在控制台窗口上占据 Y 空格 例如 printf 3d 10 console 10 printf 5d 5 console 5 我如何在 python 3 中使用它 This pr
  • 学习Python中的解析器

    我记得我读过有关解析器的内容 您只需提供一些示例行 它就知道如何解析某些文本 它只是确定两条线之间的差异 以了解可变部分是什么 我以为它是用 python 写的 但我不确定 有谁知道那是什么图书馆吗 可能你的意思是模板制作器 http co
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 为什么我会收到 ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

    以下代码给出了值错误 major males for row in recent grads if recent grads Men gt recent grads Women major males append recent grads
  • cxfreeze virtualenv 中缺少 distutils 模块

    从 python3 2 项目运行 cxfreeze 二进制文件时 我收到以下运行时错误 project dist project distutils init py 13 UserWarning The virtualenv distuti
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 尝试校准keras模型

    我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV 尝试将其包装为KerasClassifier并覆盖预测功能但没有成功 有人可以说我做错了什么吗 这是模型代码 def create m
  • Python FTP下载550错误

    我编写了一个 ftp 爬虫来下载特定文件 它会一直工作 直到找到要下载的特定文件 然后抛出此错误 ftplib error perm 550 该文件存在于我的下载文件夹中 但文件大小为 0 kb 我需要转换某些内容才能下载吗 我可以访问 f
  • 如何在 python 中使用交叉验证执行 GridSearchCV

    我正在执行超参数调整RandomForest如下使用GridSearchCV X np array df features all features y np array df gold standard labels x train x
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • 类变量:“类列表”与“类布尔值”[重复]

    这个问题在这里已经有答案了 我不明白以下示例的区别 一次类的实例可以更改另一个实例的类变量 而另一次则不能 示例1 class MyClass object mylist def add self self mylist append 1
  • 机器学习的周期性数据(例如度角 -> 179 与 -179 相差 2)

    我使用 Python 进行核密度估计 并使用高斯混合模型对多维数据样本的可能性进行排名 每一条数据都是一个角度 我不确定如何处理机器学习的角度数据的周期性 首先 我通过添加 360 来删除所有负角 因此所有负角都变成了正角 179 变成了
  • Kivy TextInput 水平和垂直对齐(文本居中)

    如何在 Kivy 的 TextInput 中水平居中文本 I have the following screen But I want to centralize my text like this 这是我的 kv 语言的一部分 BoxLa
  • 可疑地使用“else”与 i/o 结合,看到“;”靠近“如果”

    以下是导致此问题的代码 if fromProc 0 MSG SLEEP nempty proc2clk 0 gt proc2clk 0 fromProc 0 Woke up fromProc 0 MSG SLEEP fromProc 0 M
  • 为什么我会在 Python 字符串格式中使用除 %r 之外的其他内容?

    我偶尔会使用 Python 字符串格式 这可以像这样完成 print int i Float f String s 54 34 434 some text 但是 这也可以这样做 print int r Float r String r 54
  • 如何将Python包从旧版本安装到新版本?

    我正在使用 python 3 7 最近在 Linux 中安装了 python 3 8 是否有任何 bash 命令或脚本可以获取 3 7 的所有软件包列表并在 3 8 版本中一一安装 我想避免每个包裹都手工完成 注意 我将它们安装在我的系统中
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras
  • 如何在不同的目录中执行python脚本?

    Solved对于可能觉得这有帮助的人 请参阅下面我的答案 我有两个脚本 a py 和 b py 在我当前的目录 C Users MyName Desktop MAIN 中 我运行 gt python a py 第一个脚本 a py 在我当前

随机推荐

  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • page.goto() 上的云函数超时

    我在云函数中使用 puppeteer 运行测试 如果我在本地机器上运行测试一切都很好 如果我在云函数模拟器中运行测试也没关系 但是当我将函数部署到云端时 所有测试都停留在 page goto https 并且函数因超时而失败 在我的例子中是
  • 如何从字符串列中提取数字?

    我的要求是从列中的评论列中检索订单号comment并且总是开始于R 订单号应作为新列添加到表中 输入数据 code id mode location status comment AS SD 101 Airways hyderabad D
  • 用于从深层嵌套列表/元组中提取元素的递归函数

    我想编写一个从深层嵌套元组和列表中提取元素的函数 假设我有这样的东西 l THIS THAT a b c THAT d e f 我想要一个没有 这个 和 那个 的简单列表 list a b c d e f 这是我到目前为止所拥有的 def
  • 如何在 MS Word 中的每个标题末尾应用宏?

    我有一个包含各种标题的文档 因此不一定是标题 1 或标题 2 而是所有类型的标题 我想做的是编写一个宏 例如 删除每个标题末尾的 2 个空格 例如 我们有 这是一个标题 在标题的最后 我会这样做 Selection Delete Unit
  • 批处理文件测试错误级别

    我试图在另一个 exe 成功执行时有条件地从批处理文件有条件地运行一个 exe 我尝试了 IF 和 ERRORLEVEL 的几种不同组合 但似乎都不起作用 TeamBuildTypes Current Branch DatabaseUpda
  • 在我们的 Rails3/Heroku 应用程序中设置 Paperclip + AWS S3 用于图像存储时遇到问题

    我们已经构建了一个 Rails 应用程序 它有多个用户和每个用户的图像 在我们的本地主机上完成所有开发工作 我们为用户和照片提供了工作种子 但现在我们尝试使用 S3 进行图像存储 我们在 总是在 种子 期间遇到错误执行此操作时迁移的步骤 耙
  • 在python中将数字转换为字符串

    我遇到了将数字转换为字符串的问题 我想从 str 0100 获取字符串 0100 但我得到的是 64 有什么方法可以从 0100 获取字符串 0100 UPDATE 感谢许多人指出前导 0 是八进制的指示符 我知道 我想要的是将 0100
  • 与两点相交的圆心

    给定 2D 平面上的两个点 以及与这两个点相交的半径为 r 的圆 计算该圆中心的公式是什么 我意识到圆圈可以放置在两个地方 当从任意角度开始扫描围绕其中一个点连接两个点的线时 我希望首先沿顺时针方向遇到其中心的圆 我想这是我的问题的下一阶段
  • 保留子网范围内的私有IP地址

    我有一个 Arm 模板 其中有一个带有 2 个子网的 vNet 我正在尝试使用静态专用 IP 地址将网卡部署到其中之一 它曾经是动态的 并且运行良好 现在它是静态的 我已经设置了我想要网卡拥有的IP 但是当我部署时 它说IP无效 我尝试更改
  • org.openqa.selenium.SessionNotCreatedException:会话未创建已断开连接:无法将消息发送到 ChromeDriver 和 Chrome 的渲染器错误

    我尝试使用 Selenium 在 Java 上运行这个简单的程序 import org openqa selenium WebDriver import org openqa selenium chrome ChromeDriver pub
  • Hibernate 抛出奇怪的错误:类未映射

    这是错误 org hibernate hql ast QuerySyntaxException Payment is not mapped select p from Payment p 我不明白为什么会抛出这个错误 应该映射该类 正如我将
  • 数据库不存在。确保名称输入正确

    为什么我会出现这个错误 如果您查看屏幕截图 您将看到数据库 仅当我连接到两个数据库引擎时才会发生这种情况 它仅检测下面数据库引擎中的数据库 而不检测突出显示的数据库 除了关闭应用程序并仅打开一个数据库引擎之外 还有其他方法可以使用我的数据库
  • 如何使用 EclipseLink 处理以 Oracle 类型作为输入或输出的 Oracle 存储过程调用

    我进行了概念验证 以了解使用 EclipseLink 调用存储过程的效率如何 我能够使用带有标量 原始数据类型 链接整数 varchar 等 的 EclispeLink 来调用 Oracle 存储过程 我想了解如何使用集合 Oracle 类
  • PDO 库比本机 MySQL 函数更快吗?

    我已经阅读了几个与此相关的问题 但我担心它们可能已经过时 因为自这些问题得到解答以来 更新版本的 PDO 库已经发布 我编写了一个 MySQL 类 它构建查询并转义参数 然后根据查询返回结果 目前这个类正在使用内置的mysql函数 我很清楚
  • Nhibernate 出现 TransactionScope 错误 - DTC 事务预准备阶段失败 - 升级到 Nhibernate 3.0

    在事务 Scope Eg 中使用 Nhibernate 和 ADO Net 操作时 出现以下异常 Nhibernate 2 1 没问题 但现在升级到 3 0 会抛出错误 using var scope new TransactionScop
  • 我怎样才能强制Make一直执行一个菜谱

    当前的 Makefile 有这样的内容 target1 lib1 a lib2 a target2 lib1 a lib3 a target3 lib3 a lib1 a MAKE C sub dir all 我想更改此 Makefile
  • Geopandas 数据框指向多边形

    我有一个 geopandas 数据框 由 id 和由 2D 点填充的几何列组成 我想连接每个唯一 id 的点来创建一个多边形 以便我的新数据框将多边形作为其几何形状 我的代码目前看起来像这样 polygons geopandas GeoDa
  • Cocoa - 在另一个 xib 上显示 xib

    谁能告诉我如何 或指导我有关信息 在另一个 xib 笔尖 上显示 xib 笔尖 我希望如何放置它 以便我可以以编程方式将它移动到主笔尖 就像这样 这显然不起作用 void drawRect NSRect dirtyRect NSRect c
  • 如何多线程从列表中读取字典并输入数据库

    我正在尝试对以下代码进行多线程处理 但似乎无法使其正常工作 以下代码 其中我删除了大部分代码只是为了说明目的 目前运行顺利 但速度很慢 对于 3600 条推文的列表大约需要 5 分钟 import dataset import dateti