これまでデータベースアプリに仕込んだ解析プログラムの中間ファイルだったりダウンロードする解析済みファイルなどは各個人のプライベートフォルダに記録することにしていた。共有のフォルダにtempファイルを落とすようにすると、複数人でアクセスしたときにデータが混線するから。
しかしその方式だとユーザーごとに登録する必要があるし、ユーザー管理も面倒くさい。そこで一計を案じ、tempデータにタイムスタンプをつけて、混線しないようにデータをやり取りできる方法をとることにした。
具体的には動作の最初くらいにunixtimeを参照し、それを文字列としてtempファイル名に入れ込んでやり、続くプログラムでもその文字列を順次リレーしていくという感じ。
timeId = str(time.time()) target = "./temp/" + timeId + "_list.txt" outfile = open(target, 'w') outtsv = csv.writer(outfile, delimiter='\t', lineterminator='\n') for record in q.all(): outtsv.writerow([record.nbt_id]) outfile.close() link = "<a href='/hogehoge/hoge_list/?id=" + timeId + "' download='hoge_list.txt' class='btn btn-default btn-xs'>Download hoge list</a>"
みたいに出来上がったtempファイルを次の処理にリレーできるようにリンクを生成するなど。
ただ、この方式だと./tempフォルダが早晩ファイルで溢れかえることになるので、古くなったtempファイルを削除してやる必要がある。新しいファイルと入れ替え方式にすると、他のユーザーが作ったtempファイルも消してしまいかねないのでだめ。最初cronで定期的にrmするか?とも思ったが、タイミングが難しいので、新しいtempファイルを作るタイミングで、そのタイムポイントから、いくらかさかのぼった時間以前のファイルを消してやるようにする。誰もアクセスしなかったらいつまでもファイルが残ることにはなるが、実害はそんなにないと思う。(生成されるファイルサイズにもよるが)
timeNow = time.time() timeOld = timeNow - 3600 files = os.listdir("./temp") for file in files: file = "./temp/" + file t = os.path.getmtime(file) if t < timeOld: os.remove(file) timeId = str(timeNow) target = "./temp/" + timeId + "_list.txt" ・・・・
のように。この例では3600秒(1時間)前より古くなったファイルを./tempフォルダから探し出してos.remove()で順番に消していっている。
これでユーザー登録無しで混線の心配なく使うことができるね。
1時間ぼーっとしていたらせっかく解析したファイルは消えてしまうことになるけど。ダウンロードはお早めに。