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



コメント