0.5.0をリリースして、すぐ0.5.1にしましたけどw
いや、あまりにも0.5.0のサンプルが分かりにくいなと思って、READMEだけ更新したけど、pypiって同じバージョンでREADMEだけ変えられないっぽいから仕方なく。
0.4.xまでは、AGEFreighter.loadFromCSV()みたいにしてたんだけど、ちょっと対応するソースフォーマットが増えてきたのと、それぞれのクラスに責任を分割した方がテストもデバッグも楽だな、となりまして。
なので、下記の通り、Factory.create_instance(class_name)して、instance.connect()してから、instance.load()するようにしました。どのクラスでも、connect() / load()は同じで、argumentだけ違うという作りです。Asyncなのは0.4.xまでと変わりません。
import asyncio
import os
from agefreighter import Factory
import logging
log = logging.getLogger(__name__)
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
async def main():
class_name = "CSVFreighter"
instance = Factory.create_instance(class_name)
await instance.connect(
dsn=os.environ["PG_CONNECTION_STRING"],
max_connections=64,
)
await instance.load(
graph_name="AgeTester",
start_v_label="Actor",
start_id="ActorID",
start_props=["Actor"],
edge_type="ACTED_IN",
end_v_label="Film",
end_id="FilmID",
end_props=["Film", "Year", "Votes", "Rating"],
csv="./actorfilms.csv",
drop_graph=True,
)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
今回は、パフォーマンスに大きな影響がある部分に、concurrent.futuresを使って並列実行を強化してます。ただ、必ずしも速くなってないのが悩みどころで、concurrent.futuresを使うオーバーヘッドがそれなりにありそうだな、と。
あとCosmos Gremlinについては、ノードとエッジの取得アルゴリズムを完全に書き直したので、そこそこ速くなったもののこちらもまだ改善の余地がありそう。
test_loadFromCosmosGremlin : time, 156.66, chunk_size: 128, direct_loading: False, use_copy: False
test_loadFromCosmosGremlin : time, 84.32, chunk_size: 128, direct_loading: True, use_copy: False
test_loadFromCosmosGremlin : time, 84.95, chunk_size: 128, direct_loading: False, use_copy: True
Test Result for CosmosGremlinFreighter:
case(0) SUCCEEDED direct_loading(False) and use_copy(False), in 60.50 seconds
case(1) SUCCEEDED direct_loading(True) and use_copy(False), in 24.04 seconds
case(2) SUCCEEDED direct_loading(False) and use_copy(True), in 24.39 seconds
ついでというのもアレだけど、Testも完全にゼロから書き直しました。tests/agefreightertester.pyと、テスト用のデータを作る(といっても変換してるだけ)agefreighterutils.pyを追加してあります。