Soru Python / Django ile büyük dosyalar yükleniyor


Django / Python kullanarak bir web uygulaması aracılığıyla yaklaşık 4GB boyutunda dosya yükleme konusunda herhangi bir etkilenme olup olmadığını merak ediyorum? Geçmişte Java'yı kullanarak yüklenen akışların tercih edilen yöntem olduğunu hatırlıyorum ama bugün hala bunu mu yoksa Django / Python ile bunu yapmak tamamen güvenli mi?


18
2017-11-23 21:03


Menşei


"tamamen güvenli"? Her zaman mükemmeldi. Bu konuda ne "güvensiz" olabilir? Ne hakkında endişeleniyorsun? Hangi problemlerden kaçınmak istersiniz? - S.Lott
Java veya benzerleri (bir tarayıcı eklentisi olarak - bu bölüm anahtar) geçmişte bu tür bir şey için kullanıldı, çünkü daha sonra başlangıçlar, durdurmalar ve aktarma işlemlerine başlanabiliyor. HTTP üzerinden 4GB yükleniyor, (standart bir dosya yükleme alanı kullanarak) deliriyor. Dönemi. - Chris Pratt
Chris, neden deliriyor? Daha fazla detay verebilir misiniz? Yüklenen dosyanın web uygulaması ve kullanıcı hesabına göreli olması nedeniyle bir alternatif önerebilirsin, bu yüzden FTP vb. Bir çözüm değildir. - JeffC


Cevaplar:


Django varsayılan olarak 2,5MB'den küçükse, karşıya yüklenen dosya verilerini belleğe yerleştirir. Sunucuya daha büyük bir şey yazılacaktır. /tmp dizin tamamlandıktan sonra aktarım tamamlandığında kopyalanır. Django'nun dosya yükleme ayarlarının çoğu özelleştirilebilir, ayrıntılar Dökümantasyon. Dosya işlemeyi de özelleştirebilirsiniz ve kesinlikle bunu yapmak isteyeceksiniz.

Herhangi bir teknik kısıtlamadan önce, tarayıcı ile bu büyük dosyaları yüklemek kullanıcıya çok zayıf bir deneyim verecektir. Aktarımın nasıl gittiği hakkında bir geri bildirim yok (google chrome, yükleme durumunu yüzde olarak gösterse de) ve aktarımı duraklatmak veya sürdürmek için hiçbir yol yoktur.

Sunucuda da sorun yaşamanız muhtemeldir. Aktarılan verilerle uğraşırken her bir iş parçacığının alınacağı son derece uzun sürenin dışında, sistemin sonuçta elde edilen dosyayı kopyalaması için gereken süreye sahip olursunuz. /tmp doğru yere.

Sunucunun yüklemelerle ilgili olabileceği herhangi bir sorunu önceden görebileceğinizden emin değilseniz, bunun kötü bir fikir olduğunu öneriyorum. Google üzerinden bu konuda herhangi bir bilgi bulmak oldukça zordur ve büyük dosya yüklemeleriyle ilgili sorunları tanımlayan birçok isabet var gibi görünmektedir.

Django teknik olarak bu büyük dosya yüklenen dosyaları alma yeteneğine sahipken, çok zayıf kullanıcı deneyimi ve teknik zorluklar bunun en iyi yaklaşım olamayacağı anlamına geliyor. Dosya aktarımı için özel yazılım kullanmayı düşündünüz mü?


20
2017-11-24 00:13



Merhaba adamnfish, kapsamlı yanıt için teşekkürler. Ayrı bir hizmeti düşünmüştüm, bununla ilgili tek sorunum, bu belirli gruplar için belirli bir web uygulamasıdır, oluşturdukları tüm filmleri yükleyecektir, ki bunlar 4GB olabilir, bu yüzden 4GB'a bir limit ayarlıyorum. Bu fikir, bu dosyaları yükleyebilecekleri ve hesaplarına bağlı olacaklarıdır. Hesaplarında birden fazla dosya olabilir. Ben kullanıcı deneyiminin farkındayım ve onlar da iyi ve bununla iyi, ben sadece bunu yapmak için en iyi yolu anlamaya ihtiyacım var, bu yüzden sunucu sorunları yok - JeffC
kullanım django-chunked-uploads! (yasal uyarı: Bu kitaplığı yazdım). - juliomalegria


Son cevap bunu kapsamaktadır. Rutin olarak 2.5mb + (genellikle 4GB değil) yükleriz.

adamnish bağlantısı doğru, bu parçacığa bakın (onun django dokümanlarına bağlantıDosyayı diske yazmayla ilgili olarak, önce belleğe yazmak yerine:

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

"Chunks" çağrısıyla ilgili daha fazla bilgi: https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks

Sayfa "yığın" boyutunu vb. Ayarlamayı içerir.


5
2018-04-17 16:51