質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1793閲覧

大容量ファイルの読み込みを一度だけに済ませたい

Vinoue

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/05/19 14:38

編集2019/05/19 14:41

やりたいこと

現在、4GBの「data.pickle」というファイルがあります。

python

1import pandas as pd 2 3# 読み込み 4df = pd.read_pickle("data.pickle") 5 6# 何かの計算処理 7df = df * input() 8 9# 結果 10print(df.describe())

一例としてのサンプルコードですが、
以上のようにしてファイルを読み込むのですが、このpythonファイルを実行するたび、毎回4GBのファイルを読み込むことになり、これが大変時間がかかります。

最初の一回だけ(時間がかかってもいいので)メモリに読み込んでおいて、
二回目以降はdfだけすでにメモリに読み込まれた状態のものを使うことができる……みたいな方法はないのでしょうか?

ちなみに上記の「# 何かの計算処理」という箇所は、実際にはかなり長くて、複数の関数を行ったり来たりしているややっこしいコードなので、
できればファイルの読み込み部分df = pd.read_pickle("data.pickle") だけ変えて処理できる方法を知りたいです。

ご存知の方よろしくお願いします。

環境

Ubuntu 19.04
メモリはGCEを使うので64GBぐらいまで使えます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Jupyterとかなら起動中はメモリに載せっぱなしというのもできますが、毎回プロセスを立ち上げ直すのであれば「無理」です。

ということで代替案ですが、以下の2つくらいでしょうか。

  • そのデータをto_pickleで吐き出すときに圧縮しておけば4GBが300MBくらいにはなるかもしれません。そうすると3.7GB分のファイルI/Oのコストが浮き、代わりに解凍のコストが生じます。一般的にファイルI/Oは圧縮データの解凍より高コストなので、差し引き黒字になると思います。試す価値はあります。
  • システムにRAMディスクを作っておいて読み込みたいpickleをそこに置くという手があります。SSDと比べても数桁高速なので、それくらい速くなるかもしれません。

投稿2019/05/19 14:50

編集2019/05/19 14:51
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Flaskで簡易サーバを立てるというのはどうでしょうか。
データ読込はサーバ起動時のみ。計算は以下例ではhttp://localhost:5000/calc?add=10のように指定URL呼出でパラメータも渡せます。

Python

1from flask import Flask, request 2import pandas as pd 3 4app = Flask(__name__) 5 6@app.route('/') 7def hello(): 8 return('hello!') 9 10# http://localhost:5000/calc?add=10 など 11@app.route('/calc') 12def calc(): 13 val = int(request.args.get('add')) 14 df2 = df + val # 何らかの計算 15 return(str(df2.describe())) 16 # val count 3.0 mean 12.0 std 1.0 min 11.0 25% 11.5 50% 12.0 75% 12.5 max 13.0 17 18 19if __name__ == "__main__": 20 df = pd.read_pickle('data.pickle') # pd.DataFrame([1,2,3]) 21 app.run(debug=True)

投稿2019/05/20 01:12

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問