【Python】aiofileとdatasetを使用し非同期でファイルを読み込みデータをインメモリに格納する

スポンサーリンク

Pythonでaiofileとdatasetを使用し非同期でファイルを読み込みデータをインメモリに格納してみます。

今回はasyncio、aiofile、datasetを用います。これらのライブラリ・モジュールがPythonに事前にインストールされているかを確認しスクリプトを実行してください。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows11)

■読み込むファイルを用意する

まずは読み込むファイルを用意します。Pythonが実行されている作業ディレクトリ(カレントディレクトリ)内に今回は「data.txt」というテキストファイルを作成します。

This is line 1.
This is line 2.
This is line 3.

作成後、テキストエディタなどでテキストファイルの中身を記述します。今回は上記の内容を記述します。記述後、保存します。

■aiofileとdatasetを使用し非同期でファイルを読み込みデータをインメモリに格納する

保存後、aiofileとdatasetを使用し非同期でファイルを読み込みデータをインメモリに格納するスクリプトを書いていきます。

■コード

import asyncio
import aiofile
import dataset

async def read_text_file(file_path):
    data = []
    async with aiofile.async_open(file_path, 'r') as afp:
        async for line in afp:
            data.append(line.strip())
    return data

async def main():
    file_path = 'data.txt'

    # テキストファイルを非同期で読み込む
    data = await read_text_file(file_path)

    # インメモリデータベースを作成する
    db = dataset.connect('sqlite:///:memory:')

    # データをインメモリデータベースに挿入する
    table = db['data']
    for line in data:
        table.insert({'text': line})

    # クエリを実行してデータを取得する
    result = table.find_one(id=1)
    result2 = table.find_one(id=2)
    result3 = table.find_one(id=3)
    print(result)
    print(result2)
    print(result3)

asyncio.run(main())

まずはモジュールのインポートします。今回は非同期処理を行うためのasyncioを、そして非同期でファイルを操作するためのaiofileを使い、データベースの操作を行うためのdatasetを用います。

次に非同期関数であるread_text_file()を定義します。指定されたテキストファイルを非同期で読み込み、行ごとのデータをリストに格納して返す関数です。aiofile.async_open を使用してファイルを非同期で開き、async for ループで行ごとにデータを読み込んでいます。読み込んだ行の末尾の改行文字を削除して、リスト data に追加します。最終的に、data リストを返します。

次に非同期関数であるmain()を定義します。これはプログラムのエントリーポイントとなる非同期関数です。変数 file_path には、読み込むテキストファイルのパスが指定されています。read_text_file 関数を非同期で呼び出し、指定されたテキストファイルのデータを非同期に読み込みます。dataset.connect を使用して、インメモリデータベースを作成し、変数 db に格納します。データをインメモリデータベースのテーブルに挿入するために、table オブジェクトを作成します。リスト data の各行をループで処理し、table.insert を使用してデータベースに挿入します。
table.find_one を使用して、指定されたidのデータをクエリして結果を取得します。取得した結果を表示します。

最後にasyncio.runを使用して、main関数を実行します。なお、asyncio.runは、Python 3.7 以降で利用できる関数で、非同期処理を実行するためのランタイムを作成します。

■検証・実行

今回書いたスクリプトを「test_d.py」という名前でPythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると今回作成し指定したテキストファイルのデータがインメモリデータベースに格納され、クエリの結果が表示されることが確認できました。なお、今回使用した非同期処理では、ファイルの読み込みとデータベースへの挿入が効率的に行われます。

コメント

タイトルとURLをコピーしました