Comment résoudre l'erreur d'opération IO trop fréquente dans le code Python ?

王林
Libérer: 2023-06-24 20:49:44
original
1360 Les gens l'ont consulté

Python, en tant que langage de programmation de haut niveau, a un large éventail d'applications dans le traitement des données et dans les programmes informatiques. Cependant, lors de l'exécution d'opérations de données complexes, le code Python est sujet à des problèmes de performances causés par des opérations d'E/S fréquentes. Dans cet article, nous présenterons comment résoudre l'erreur d'opérations d'E/S trop fréquente dans le code Python.

  1. Opérations d'E/S en cache

Lorsqu'un programme Python effectue des opérations d'E/S, les données doivent être lues à partir du disque ou d'autres périphériques de stockage, ce qui entraîne IO Les opérations fréquentes affectent les performances du programme. Pour éviter que cela ne se produise, nous pouvons utiliser des opérations d'E/S mises en cache.

La mise en cache des opérations IO fait référence à la mise en cache des résultats des opérations IO dans la mémoire au lieu de lire les données du disque à chaque fois. La mise en cache des opérations d'E/S peut améliorer les performances d'un programme car elle réduit le nombre de fois où le programme accède au disque.

Par exemple, le code suivant montre comment utiliser les opérations d'E/S mises en cache pour lire les données d'un fichier :

import functools

@functools.lru_cache(maxsize=128)
def read_file(filename):
    with open(filename) as f:
        return f.read()
Copier après la connexion

Dans cet exemple, lru_cache()</ Le La fonction code> est utilisée pour mettre en cache les résultats de la fonction. Lorsque la fonction est appelée pour la première fois, ses résultats seront mis en cache en mémoire. Lorsque la fonction est à nouveau appelée, si les paramètres n'ont pas changé, le résultat sera récupéré du cache au lieu de lire les données du disque. <code>lru_cache()函数被用来缓存函数的结果。当函数第一次被调用时,它的结果将会被缓存到内存中。当函数再次被调用时,如果参数没有变化,结果将从缓存中取回而不是从磁盘读取数据。

  1. 使用内存映射文件

内存映射文件是指将文件映射到进程的内存空间中,以便可以像操作内存一样访问文件。使用内存映射文件可以避免频繁的IO操作,特别是当处理大量数据时。

下面的代码展示了如何使用内存映射文件读取大型CSV文件:

import mmap
import csv

def read_csv(filename):
    with open(filename, "rb") as csv_file:
        with mmap.mmap(csv_file.fileno(), 0, access=mmap.ACCESS_READ) as csv_data:
            reader = csv.reader(iter(csv_data.readline, b""))
            for row in reader:
                # do something with row
Copier après la connexion

在这个例子中,mmap()函数被用来将文件映射到进程的内存空间中。然后,csv.reader()函数被用来读取CSV文件中的每一行。由于文件已经被映射到内存中,因此读取数据时不需要任何IO操作,因此程序的性能得到了很大的提升。

  1. 批量读取数据

另一种减少IO操作频率的解决方案是批量读取数据。这意味着一次读取多个数据,而不是每次读取一个数据。

例如,假设我们有一个包含1000个整数的文件。如果我们需要将文件中的所有整数加起来,我们可以使用下面的代码:

total = 0
with open("data.txt") as f:
    for line in f:
        total += int(line)
Copier après la connexion

但是,这种做法会频繁地从磁盘读取数据,从而影响程序性能。相反,我们可以使用下面的代码一次性批量读取数据:

with open("data.txt") as f:
    data = f.read().splitlines()
total = sum(map(int, data))
Copier après la connexion

在这个例子中,read()函数被用来一次性读取整个文件。然后,splitlines()函数被用来将文件内容分割成行,并存储在一个列表中。最后,map()函数被用来将每个行转换成整数,并计算它们的总和。这种方法可以减少IO操作频率,提高程序的性能。

  1. 使用异步IO操作

异步IO操作是指在执行IO操作时,程序可以同时执行其他任务。与传统的同步IO操作(在执行IO操作时程序必须等待IO操作完成然后才能继续执行其他任务)不同,异步IO操作可以提高程序的并发性和吞吐量。

Python 3.4引入了asyncio库,它提供了一种方便的方式来执行异步IO操作。下面是一个使用asyncio库读取URL内容的例子:

import asyncio
import aiohttp

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    urls = [...]
    tasks = []
    for url in urls:
        tasks.append(asyncio.ensure_future(fetch_url(url)))
    results = await asyncio.gather(*tasks)
    # do something with results

asyncio.run(main())
Copier après la connexion

在这个例子中,fetch_url()函数被用来异步读取URL内容。然后,main()

    Utiliser des fichiers mappés en mémoire

    #🎜🎜#Les fichiers mappés en mémoire font référence au mappage de fichiers dans l'espace mémoire du processus afin qu'ils puissent be Accédez aux fichiers tout comme à la mémoire d’exploitation. L'utilisation de fichiers mappés en mémoire peut éviter les opérations d'E/S fréquentes, en particulier lors du traitement de grandes quantités de données. #🎜🎜##🎜🎜#Le code suivant montre comment lire un gros fichier CSV à l'aide d'un fichier mappé en mémoire : #🎜🎜#rrreee#🎜🎜#Dans cet exemple, la fonction mmap() est utilisé pour mapper les fichiers dans l'espace mémoire du processus. Ensuite, la fonction csv.reader() est utilisée pour lire chaque ligne du fichier CSV. Étant donné que le fichier a été mappé en mémoire, aucune opération d'E/S n'est requise lors de la lecture des données, les performances du programme sont donc grandement améliorées. #🎜🎜#
      #🎜🎜#Lire les données par lots#🎜🎜##🎜🎜##🎜🎜#Une autre solution pour réduire la fréquence des opérations d'E/S consiste à lire les données par lots. Cela signifie lire plusieurs données à la fois au lieu de lire une donnée à la fois. #🎜🎜##🎜🎜#Par exemple, disons que nous avons un fichier contenant 1000 entiers. Si nous devons additionner tous les entiers du fichier, nous pouvons utiliser le code suivant : #🎜🎜#rrreee#🎜🎜# Cependant, cette approche lira fréquemment les données du disque, affectant ainsi les performances du programme. Au lieu de cela, nous pouvons utiliser le code suivant pour lire les données par lots à la fois : #🎜🎜#rrreee#🎜🎜#Dans cet exemple, la fonction read() est utilisée pour lire l'intégralité du fichier à une fois. Ensuite, la fonction splitlines() est utilisée pour diviser le contenu du fichier en lignes et les stocker dans une liste. Enfin, la fonction map() permet de convertir chaque ligne en entier et de calculer leur somme. Cette méthode peut réduire la fréquence des opérations d'E/S et améliorer les performances du programme. #🎜🎜#
        #🎜🎜#Utiliser des opérations d'E/S asynchrones#🎜🎜##🎜🎜##🎜🎜#Les opérations d'E/S asynchrones signifient que lors de l'exécution d'opérations d'E/S, le programme peut effectuer d'autres tâches en même temps. en même temps. Contrairement aux opérations d'E/S synchrones traditionnelles (lors de l'exécution d'opérations d'E/S, le programme doit attendre la fin de l'opération d'E/S avant de continuer à effectuer d'autres tâches), les opérations d'E/S asynchrones peuvent améliorer la concurrence et le débit du programme. #🎜🎜##🎜🎜#Python 3.4 a introduit la bibliothèque asyncio, qui fournit un moyen pratique d'effectuer des opérations d'E/S asynchrones. Voici un exemple d'utilisation de la bibliothèque asyncio pour lire le contenu d'une URL : #🎜🎜#rrreee#🎜🎜#Dans cet exemple, la fonction fetch_url() est utilisée pour lire de manière asynchrone Obtenez le contenu de l'URL. La fonction main() est ensuite utilisée pour effectuer plusieurs opérations d'E/S asynchrones simultanément et traiter les résultats une fois toutes les opérations terminées. L'utilisation d'opérations d'E/S asynchrones peut éviter des opérations d'E/S trop fréquentes et améliorer les performances du programme. #🎜🎜##🎜🎜#Dans le résumé, nous avons présenté comment résoudre l'erreur des opérations d'E/S trop fréquentes dans le code Python. L'utilisation de technologies telles que les opérations d'E/S mises en cache, les fichiers mappés en mémoire, la lecture par lots de données et les opérations d'E/S asynchrones peuvent réduire efficacement la fréquence des opérations d'E/S, améliorer les performances du programme et éviter les erreurs causées par les opérations d'E/S. En tant que programmeurs Python, nous devons connaître ces techniques et les utiliser en cas de besoin. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal