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が実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると今回作成し指定したテキストファイルのデータがインメモリデータベースに格納され、クエリの結果が表示されることが確認できました。なお、今回使用した非同期処理では、ファイルの読み込みとデータベースへの挿入が効率的に行われます。
コメント