我有一个大文件,每行都有JSON记录。 我正在编写一个脚本,以通过API将这些记录的子集上载到CouchDB,并尝试各种方法来查看最快的方法。 这是我发现工作最快或最慢的方法(在本地主机上的CouchDB实例上):

将每个所需的记录读入内存。 将所有记录存储在内存中后,为每个记录生成一个上传协程,并立即收集/运行所有协程

同步读取文件,并在遇到所需记录时同步上传

使用aiofiles读取文件,并在遇到所需记录时异步更新

方法1比其他两种方法快得多(大约快一倍)。 我很困惑为什么方法2比方法3更快,尤其是与此处的示例相反, 该示例异步运行所需的时间比同步运行所需的时间少一半(未提供同步代码,必须自己重写)。 是上下文从文件I / O切换到HTTP I / O,尤其是与API上传相比,文件读取的发生频率要高得多吗?

为了进一步说明,这是代表每种方法的一些Python伪代码:

方法1-同步文件IO,异步HTTP IO

import json

import asyncio

import aiohttp

records = []

with open('records.txt', 'r') as record_file:

for line in record_file:

record = json.loads(line)

if valid(record):

records.append(record)

async def batch_upload(records):

async with aiohttp.ClientSession() as session:

tasks = []

for record in records:

task = async_upload(record, session)

tasks.append(task)

await asyncio.gather(*tasks)

asyncio.run(batch_upload(properties))

方法2-同步文件IO,同步HTTP IO

import json

with open('records.txt', 'r') as record_file:

for line in record_file:

record = json.loads(line)

if valid(record):

sync_upload(record)

方法3-异步文件IO,异步HTTP IO

import json

import asyncio

import aiohttp

import aiofiles

async def batch_upload()

async with aiohttp.ClientSession() as session:

async with open('records.txt', 'r') as record_file:

line = await record_file.readline()

while line:

record = json.loads(line)

if valid(record):

await async_upload(record, session)

line = await record_file.readline()

asyncio.run(batch_upload())

我正在使用的文件大小约为1.3 GB,共有100000条记录,我上传了691条。 每次上传均以GET请求开头,以查看记录是否已存在于CouchDB中。 如果是这样,则执行PUT以使用任何新信息来更新CouchDB记录; 如果不是,则将记录过帐到数据库。 因此,每个上传都包含两个API请求。 出于开发目的,我仅创建记录,因此我运行GET和POST请求,总共1382个API调用。

方法1大约需要17秒,方法2大约需要33秒,方法3大约需要42秒。

python读取大文件太慢_python - 为什么使用Python异步从文件读取和调用API比同步慢? - 堆栈内存溢出...相关推荐

  1. python读取大文件太慢_强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  2. python读取大文件太慢_python读取大文件越来越慢的原因与解决

    背景: 今天同事写代码,用python读取一个四五百兆的文件,然后做一串逻辑上很直观的处理.结果处理了一天还没有出来结果.问题出在哪里呢? 解决: 1. 同事打印了在不同时间点的时间,在需要的地方插入 ...

  3. python读取大文件的坑_Python读取大文件的坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

  4. python读取大文件的坑_python读取大文件踩过的坑——读取txt文件词向量

    在读取https://github.com/Embedding/Chinese-Word-Vectors中的中文词向量时,选择了一个有3G多的txt文件,之前在做词向量时用的是word2vec,所以直 ...

  5. python读取大文件的坑_如何在Python中读取大文件的特定部分

    Given a large file (hundreds of MB) how would I use Python to quickly read the content between a spe ...

  6. python读取大文件的某行_python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

  7. python读取大文件-python如何读取大文件以及分析时的性能优化小技巧

    在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...

  8. python读取大文件-使用Python读取大文件的方法

    背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...

  9. 使用python读取大文件

    读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容. python读取大文件通常两种方法:第一种是利用yield生成器读取:第二种是:利用open( ...

  10. python 读取大文件

    python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...

最新文章

  1. 谁扛起张一鸣的游戏野心?
  2. usestate中的回调函数_React 中获取数据的 3 种方法:哪种最好?
  3. python正则表达式实例教程_Python正则表达式经典入门教程
  4. 11.reindex操作
  5. Anaconda创建python虚拟环境
  6. div 超出高度滚动条,超出宽度点点点
  7. 【script】python实现多线程将doc、docx转pdf,doc转docx
  8. 零基础学python pdf-笔记《零基础入门学习Python(第2版)》PDF+课件+代码分析
  9. 三阶贝塞尔曲线选点_贝塞尔曲线
  10. java微信昵称处理_Java微信开发昵称表情符过滤
  11. SSL证书收费的原因
  12. 基于微信公众号的答题投票系统——项目开发心得体会记录
  13. pma连接,报错10061
  14. 计算机开机最快,教你如何让你的电脑快速开机
  15. 单片机系统的电磁兼容性设计
  16. 北京交通大学计算机考研分数2019,2019北京交通大学考研复试分数线
  17. 【论文笔记】A Reinforcement Learning Method for Multi-AGV Scheduling in Manufacturing
  18. USB协议详解第5讲(USB描述符-接口描述符)
  19. the rode to success
  20. 苹果平板怎么卸载软件_手机系统自带软件没用还占内存,到底怎么才能卸载?其实很简单!...

热门文章

  1. 《人月神话》之画蛇添足读后感
  2. Flex创建弹出菜单(PopUpButton/Menu/PopMenuButton)
  3. 2006年上半年开发心得
  4. unity中调用dll文件总结
  5. jenkins vue 打包特别慢_Jenkins 自动化部署
  6. ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX
  7. 此笔记只作为自身笔记,结构比较混乱,不建议参考,如有需要请访问其他文献,servlet的基础知识和使用
  8. comon lisp标准_Common Lisp 的一些函数
  9. WPF控件获得焦点时去除虚线框
  10. AWS表示:我们将用Lambda函数让移动应用程序再次变得伟大