CUDA を利用する Python のパッケージは、多くの場合それ自体のバージョンだけでなく対応している CUDA Toolkit や cuDNN のバージョンまで気にする必要がある。
なんだか環境やコンテナイメージを作るたびに確認する方法や互換性について調べている気がするので、以下のパッケージについてまとめておく。
$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f499b0f5b72b ubuntu:18.04"bash"31 seconds ago Up 29 seconds eloquent_keller
それでは、docker commit コマンドを使って、コンテナからイメージを作ろう。
最初の引数にお目当てとなるコンテナの ID ないし名前を指定して、次の引数にコンテナを元ネタにしたイメージの名前を指定する。
$ docker commit f499b0f5b72b example
sha256:0bbb09b0e9a30bfd0ba7a342eddb7bbcc6380b0542a1379c7c8e54587e24392a
イメージの一覧を確認すると、ちゃんと指定した名前でイメージができている。
$ docker image list | grep example
example latest 0bbb09b0e9a3 14 seconds ago 64.2MB
作ったイメージからコンテナを起動する
上記のイメージを使ってコンテナを立ち上げてみよう。
$ docker container run \
--rm \
-it example \
bash
今回は、GNU date を使って月末の日付を得る方法について。
シェルスクリプトで一ヶ月単位の処理を書こうとすると、よく調べることになるのでメモしておく。
検証に使った環境は次のとおり。
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H15
$ date --version
date (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie.
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H15
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.
$ dirname --version
dirname (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie and Jim Meyering.
作成されたデータベースのスキーマを確認してみよう。
すると、次のとおり age カラムにインデックスが確認できる。
$ sqlite3 example.db ".schema"
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE users (
name TEXT NOT NULL,
age INTEGER NOT NULL,
PRIMARY KEY (name)
);
CREATE INDEX ix_users_age ON users (age);
最初からテーブルの定義にインデックスがない場合
続いてが本題の、最初の定義にはインデックスの指定がない場合について。
以下のサンプルコードでは、先ほど作成したテーブルを DROP して、新たにインデックスの指定がないものを作り直している。
#!/usr/bin/env python3# -*- coding: utf-8 -*-import logging
from sqlalchemy import create_engine
from sqlalchemy.engine import Engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer
from sqlalchemy.types import Text
ModelBase = declarative_base()
LOGGER = logging.getLogger(__name__)
classUser(ModelBase):
__tablename__ = 'users'
name = Column(Text, primary_key=True)
# この時点ではインデックスがない
age = Column(Integer, nullable=False)
definit_db(engine: Engine, drop: bool = False):
if drop:
ModelBase.metadata.drop_all(engine)
ModelBase.metadata.create_all(engine)
defget_engine(db_uri: str) -> Engine:
engine = create_engine(
db_uri,
pool_recycle=3600,
encoding='utf-8',
)
return engine
defmain():
logger = logging.getLogger('sqlalchemy')
logger.setLevel(logging.DEBUG)
logging.basicConfig(level=logging.DEBUG)
db_uri = 'sqlite:///example.db?cache=shared'
engine = get_engine(db_uri)
init_db(engine, drop=True)
if __name__ == '__main__':
main()
上記を実行してみよう。
$ python withoutindex.py
...
すると、次のようにインデックスのないテーブルが作り直される。
$ sqlite3 example.db ".schema"
CREATE TABLE users (
name TEXT NOT NULL,
age INTEGER NOT NULL,
PRIMARY KEY (name)
);
$ sqlite3 example.db ".schema"
CREATE TABLE users (
name TEXT NOT NULL,
age INTEGER NOT NULL,
PRIMARY KEY (name)
);
CREATE INDEX ix_users_age ON users (age);