2017-01-06 7 views
0

私のDjangoアプリケーションでは、巨大なファイルを処理する必要があります。 Webアプリケーションを介してアップロードする代わりに、ユーザはSamba共有上のフォルダ(.dump)に配置し、Djangoアプリでそのファイルを選択してDjangoアプリケーションから新しいモデルインスタンスを作成することができます。ビューは、おおよそ次のようになります。MEDIA_ROOT.dumpとしてなぜ同じパーティションの既存ファイルからdjango FileFieldを設定するのが遅いのですか?

class AddDumpedMeasurement(View): 
    def get(self, request, *args, **kwargs): 
     filename = request.GET.get('filename', None) 

     dump_dir = os.path.join(settings.MEDIA_ROOT, settings.MEASUREMENT_DATA_DUMP_PATH) 
     in_file = os.path.join(dump_dir, filename) 

     if isfile(in_file): 
      try: 
       with open(in_file, 'rb') as f: 
        object = NCFile.objects.create(sample=sample, created_by=request.user, file=File(f)) 

       return JsonResponse(data={'redirect': object.get_absolute_url()}) 
      except: 
       return JsonResponse(data={'error': 'Couldn\'t read file'}, status=400) 
     else: 
      return JsonResponse(data={'error': 'File not found'}, status=400) 

その新しい場所に遅いので、ファイルを移動している理由を、(Webサーバによって実装されている)と同じSamba共有上にありますか?私はそれがほぼ瞬時になると予想していたでしょう。それは私がopen()とそれをストリームファイルオブジェクトにバイトですか?その場合は、ファイルを正しい場所に移動してモデルインスタンスを作成するより良い方法がありますか?

答えて

0

一時ファイルを使用して元のファイルと置き換えると、os.renameは高速です。

tmp_file = NamedTemporaryFile() 
object = NCFile.objects.create(..., file=File(tmp_file)) 
tmp_file.close() 

if isfile(object.file.path): 
    os.remove(object.file.path) 

new_relative_path = os.path.join(os.path.dirname(object.file.name), filename) 

new_relative_path = object.file.storage.get_available_name(new_relative_path) 

os.rename(in_file, os.path.join(settings.MEDIA_ROOT, new_relative_path)) 
object.file.name = new_relative_path 
object.save() 
1

ファイルオブジェクトにopen()してバイトをストリームするからですか?

私はそうであると主張します。ファイルシステムオブジェクトに対する単純な移動操作は、ファイルシステムの内部データベース上のレコードを更新することを意味します。それは実際には瞬時になるでしょう

ローカルファイルを開くと、ファイルを1行ずつ読むのはファイルサイズによっては遅くなるコピー操作のようなものです。さらに、非常に高いレベルでこれをやっていますが、OSのコピー操作ははるかに低いレベルで行われます。

しかし、それは問題の本当の原因ではありません。あなたはファイルがsamba共有にあると言っています。私はあなたがローカルにリモートフォルダをマウントしたことを前提としています。したがって、あなたが問題のファイルを読むとき、あなたは実際にそれをネットワーク上でフェッチしています。ディスクの読み込みよりも遅くなります。次に、宛先ファイルを書き込むときに、ネットワークを介してデータを書き込んでいます。これは、ディスク書き込みよりも遅い操作です。

+0

これは本当です。回避策として、私は自分の質問に編集した解決策のように明示的にファイルを移動する必要があります。 – janoliver

+1

素晴らしい!しかし、あなたが知っているように、標準的な練習は質問を編集するのではなく、あなた自身の答えを投稿することです。それをして正しいものとして受け入れてください。しかし、dont 'upvoteに正しい方向にあなたを送った有益な答えを与えるのを忘れないでください:) – e4c5

関連する問題