2015-11-12 3 views
5

Parlak bir uygulama geliştirdim. Başladığında, O, yükler, bazı datatables. Yaklaşık 4 GB datatable. Ardından, uygulamaya bağlanan kullanıcılar arayüzü kullanabilir ve bu verilerle oynayabilir.Django uygulaması belleğe sahipken tüm isteklerde paylaşılan büyük bir Panda nesnesi var mı?

Bu uygulama güzel fakat bazı sınırlamaları var. Bu yüzden başka bir çözüm arıyorum.

Benim düşüncem Pandas ve Django'nun birlikte çalışması. Bu sayede aynı zamanda bir arayüz ve RESTful API geliştirebilirim. Ama ihtiyacım olan şey, Django'ya gelen tüm taleplerin, bir kez yüklenmiş olan pandalar veri kümelerini kullanabilmesidir. Herhangi bir istek için 4 GB'lık bir belleğin yüklenmesi gerekip gerekmediğini düşünün ... Bu korkunç olurdu.

Her yere baktım ama bunu yapmanın hiçbir yolunu bulamadım. Bu soruyu buldum: https://stackoverflow.com/questions/28661255/pandas-sharing-same-dataframe-across-the-request Ama yanıtları yok.

Verileri neden RAM'e sahip olmam gerekiyor? Çünkü sorulan sonuçları hızlıca oluşturmak için performansa ihtiyacım var. MariaDB'nin bu verileri hesaplamasını ve sürdürmesini isteyemem. Örneğin, tek R'nin ya da Python ya da diğer dillerdeki özel bir paketin yapabileceği bazı hesaplamaları içerir.

cevap

2

Belirli bir nesneyi yalnızca bir kez yüklemek (örneğe almak) ve tüm isteklerimde kullanmak istediğim benzer bir kullanım durumum var, çünkü yüklenecek süre (saniye) gerekiyor ve gecikme süresini kaldıramadım. her istek için tanıtın.

Bu özelliği yalnızca bir kez yüklemek için Django>=1.7, AppConfig.ready() yönteminde bir özellik kullanıyorum.

# apps.py 
from django.apps import AppConfig 
from sexmachine.detector import Detector 

class APIConfig(AppConfig): 
    name = 'api' 

    def ready(self): 
     # Singleton utility 
     # We load them here to avoid multiple instantiation across other 
     # modules, that would take too much time. 
     print("Loading gender detector..."), 
     global gender_detector 
     gender_detector = Detector() 
     print("ok!") 

Sonra kullanmak istiyorsanız:

from api.apps import gender_detector 
gender_detector.get_gender('John') 

ready() yöntemde veri tablosunu yükleyin ve ardından her yerden kullanabilirsiniz İşte

kodudur. Her bir WSGI çalışanı için tablonun bir kez yükleneceğini düşünüyorum, bu yüzden burada dikkatli olun.

+0

Merhaba dukebody, Cevabınız için teşekkürler! Güzel görünüyor. WSGI işçilerinin sayısını sınırlamanın mümkün olduğunu düşünüyor musunuz? Ve hepsini veriyle hazırlıyor musun? Mükemmel olurdu! İyi günler, Jerome – FrelonQuai

+0

WSGI işçilerinin sayısını kolayca sınırlandırabilirsiniz. Örneğin Gunicorn'da 'gunicorn wsgi_app_object - işçiler ' kullanın. – dukebody

+0

Cevabınız için teşekkürler! Bence bunu yapabilir! – FrelonQuai

0

Bu sorunu yanlış anlamış olabilirim, ancak kullanıcılar tarafından kolayca erişilebilen 4 GB'lık bir veritabanı tablosuna sahip olmak çok fazla sorun olmamalıdır. Gerçekten de, tarif ettiğiniz gibi bir verinin önceden yüklenmesiyle ilgili yanlış bir şey var mı? 4GB artık çok fazla RAM değil.

Şahsen, bellek sistemine bir şeyler yüklemek ve python ile çatlamak yerine veritabanı sistemini kullanmanız önerilir. Verileri doğru şekilde kurarsanız, birkaç saniyede binlerce sorgu oluşturabilirsiniz. Pandalar aslında SQL'i taklit etmek için yazılmıştır, dolayısıyla kullandığınız kodun büyük bir kısmı doğrudan SQL'e çevrilebilir. Kısa bir süre önce, bir çift yüz dosyası (pandaları kullanarak toplamda 4GB, her bir dosya için 600k satır) almak için büyük bir birleştirme işlemi kurduğum bir işte bir durum vardı. Toplam yürütme süresi 72 saat ya da bir şey gibi oldu ve bu saatte bir kez çalıştırılması gereken bir işlemdi. Bir çalışma arkadaşı aynı python/pandas kodunu 72 saat yerine 5 dakikada bitiren oldukça basit bir SQL sorgusu olarak yeniden yazdı.

Her neyse, pandalar veri çerçevenizi gerçek bir veritabanı tablosunda saklamaya çalışmanızı öneririz. Django bir veritabanı (genellikle mySQL veya Postgres) üzerine inşa edilmiştir ve pandalar bile veri çerçevenizi doğrudan dataframe.to_sql('database_connection_str') veritabanına eklemek için bir işleve sahiptir! Buradan django kodunu yazabilirsiniz, böylece yanıtlar DB'ye tek bir sorgu oluşturacak, değerleri getirecek ve verileri zamanında döndürecektir.

+0

Merhaba chill_turner ve cevabınız için teşekkürler. Verilerin ONCE yüklü olduğunu söylüyorsam, bu sunucu tarafında bir kez yüklenir demek. Ve asla müşteri tarafı olmaz. İstemci arayüzü kullanabilir, Shiny ve Shiny'a bir istek gönderilir ve bir cevap verilir. Amacınızı iyi anlıyorsam, MİNİMUMTA mariaDB tablolarının olması gerekir. Benim sorunum, MariaDB'nin bazı operasyonlar yapamaması. AField ile gruplamak ve her grubun birinci ve üçüncü sırasına sahip olmak istediğinizi düşünün (anotherField tarafından sipariş edilen). Ya da MariaDB'de olmayan birkaç şey var mı? – FrelonQuai

+0

Merhaba - MariaDB'den bahsetmeyi hatırlamıyorum ama isterseniz bunu kullanabilirsiniz. Ben django ile iyi oynadığı gibi postgres veya mysql kullanırdım. Veri django veritabanına yüklendikten sonra 'kullanıcı X'e gittiğinde tamam' python kodu yazdığınızda, veritabanına çağrı yapan ve işlenmiş bazı şeyler döndüren bu üç işlevi çalıştırırız. Bu tam olarak django (ve diğer benzer web çerçeveleri) için inşa edilmiştir! –