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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

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

Q&A

0回答

1621閲覧

レンタルサーバー上で画像処理したいが、SQLAlchemyをインポートするとOpenCVがインポートできない

mito.2357

総合スコア19

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

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

0グッド

0クリップ

投稿2020/08/27 07:36

編集2020/08/29 13:04

前提・実現したいこと

レンタルサーバー(Xserver)上の自作webアプリケーションで画像処理(resize, 圧縮)をしたいです。

発生している問題・エラーメッセージ

from flask_sqlalchemy import SQLAlchmeyが含まれるとimport cv2がエラーしてしまう。

以下の該当のソースコードのtraceback

File "/home/xs000000/---.com/public_html/test/test.py", line 14, in index import cv2 File "/home/xs000000/venv3.6/lib64/python3.6/site-packages/cv2/__init__.py", line 5, in from .cv2 import * MemoryError

実際に運用しようとしているソースコードのtraceback

File "/home/xs000000/--.com/public_html/test/app.py", line 84, in index import cv2 File "/home/xs000000/venv3.6/lib64/python3.6/site-packages/cv2/__init__.py", line 5, in from .cv2 import * ImportError: numpy.core.multiarray failed to import
File "/home/xs000000/-----.com/public_html/test/app.py", line 146, in index img = from_fileStorage_to_nparray(img) File "/home/xs000000/-----.com/public_html/test/app.py", line 54, in from_fileStorage_to_nparray import cv2 File "/home/xs000000/venv3.6/lib64/python3.6/site-packages/cv2/__init__.py", line 5, in from .cv2 import * ImportError: libGLX.so.0: failed to map segment from shared object: Cannot allocate memory'

該当のソースコード

明らかに無関係と判断した部分は省略または簡潔にしています。

python

1# -*- coding: utf-8 -*- 2# NOTE cv2は関数内インポートしている. cgiエラーするため. 3from flask import Flask 4from flask_sqlalchemy import SQLAlchemy 5 6app = Flask(__name__) 7 8FOLDER = "uploads" 9FILENAME = "sample.jpg" 10PATH = f"./{FOLDER}/{FILENAME}" 11 12 13@app.route('/') 14def index(): 15 import cv2 16 17 img = cv2.imread(PATH) 18 img = cv2.resize(img, (100, 100)) 19 img = compress_img(img) 20 cv2.imwrite(PATH, img) 21 22 return "Wrote." 23 24 25def compress_img(img, quality=10, ch=1): 26 import cv2 27 success, img = cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), quality]) 28 if not success: 29 return None 30 return cv2.imdecode(img, ch)

試したこと

  1. 上記のエラーImportError: numpy.core.multiarray failed to importをgoogleで調べたところ, numpyをアップグレードすればよいとの情報が複数見つかりましたが、これ以上アップグレードができませんでした。おそらくXserverの環境によるもの, もしくはpythonのバージョンが3.6であるためだと考えました。

  2. 次にコードを削ったりしてみたところ, 以下の条件が重なることでエラーが発生していることが分かりました。

  • databese.pyモジュールのfrom flask_sqlalchemy import SQLAlchmey
  • @app.routeでデコレートしている関数内でimport cv2

(前者は大幅にコードを書き換えなけらばならないため別の方法でデータベースを操作するのは避けたいです)

3.別の関数内でインポートし呼び出ししてみましたが、関数が呼び出されるとエラーImportError: libGLX.so.0: failed to map segment from shared object: Cannot allocate memory'が発生してしまいました。このエラーをgoogleで調べましたが特に情報は発見できませんでした。メモリの不足かと思いましたがfrom flask_sqlalchemy import SQLAlchmeyがなければ正常に動作したので関係ないと判断しました。


知識が乏しく、エラーの内容には特に踏み込めませんでした。


現在の状態に至るまで

  1. ローカル環境で正常に動作しているwebアプリケーションをXserverにアップロードしたところcgiエラー(500 Internal Server Error)が発生。import numpy import cv2がなければ動作したためこの二つによるものと判明

  2. googleで調べるとnumpyのマルチスレッドが原因であり, 以下のように環境変数でシングルスレッドにして, かつ関数内でimportすればよいとの情報が見つかり, numpyのimportによるエラーが解決

cgi

1import os 2os.environ['OPENBLAS_NUM_THREADS'] = "1"

補足情報(FW/ツールのバージョンなど)

linuxbrewでpythonをインストールしようとしましたがどうしても失敗してしまうのでvenvを使ってライブラリをインストールしました。さらにXserverではsudoコマンドの権限が与えられていないためこれ以上のpythonのバージョンアップはできません。

追記

freeコマンドの結果

total used free shared buff/cache available Mem: 527830880 11427176 502397556 626092 14006148 516403704 Swap: 23328924 0 23328924

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

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

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

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

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

yymmt

2020/08/27 12:33

状況を見ると本当にメモリが足りていないように見えます。サーバのメモリ容量は幾つでしょうか?
mito.2357

2020/08/28 03:46

コメントありがとうございます。 サーバー情報には512GBという表示がありましたが、この情報で間違いないでしょうか? それとphp.iniには1GBと書いてありました。使っているのはcgiですので無関係だと考えてますが、一応。
yymmt

2020/08/28 03:50

おそらく間違っています(そのサイズはストレージ容量では?)。 freeコマンドやtopコマンド、あるいはcat /proc/meminfoで見ることができます。
mito.2357

2020/08/28 06:15

すみません! freeコマンドの結果を追記しました。 sharedは 626092 でした。足りなさそうでしょうか?
yymmt

2020/08/29 09:05

すいません、私が間違っていました。freeの結果を見ると512GBのメモリのようです。物理メモリが足りないわけではなさそうです。
退会済みユーザー

退会済みユーザー

2020/08/31 02:39

Xserver使っていないので確認できませんが、pyenvみたいなソースからのビルドで任意のpythonインストールは出来ませんか? サーバーの方で用意してくれてるパッケージに依りますが...
yymmt

2020/09/01 09:38

まずはulimit -aコマンドでユーザリソースの制限を確認をするのはどうでしょうか?
mito.2357

2020/11/26 12:24 編集

結局、画像圧縮を諦めることにし、この質問のことを忘れてしまっていました。本当に申し訳ありません。 解決策を考えてくださり、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問