Jupyter Lab RAM dışındayken bilgisayarı dondurur - nasıl önlenir?


12

Son zamanlarda Jupyter Lab kullanmaya başladım ve benim sorunum oldukça büyük veri kümeleriyle çalışmak (genellikle veri kümesinin bilgisayar belleğimin yaklaşık 1 / 4'ü). Yeni Python nesneleri olarak kaydedilen birkaç dönüşümden sonra, hafızam tükeniyor. Sorun şu ki, kullanılabilir RAM sınırına yaklaştığımda ve başka bir RAM alanı gerektiren herhangi bir işlemi gerçekleştirdiğimde bilgisayarım donuyor ve düzeltmenin tek yolu yeniden başlatmaktır. Bu Jupyter Lab / Notebook'da varsayılan bir davranış mı yoksa ayarlamam gereken bazı ayarlar mı? Normalde, tüm bilgisayarın değil, programın çökmesini beklerim (örneğin RStudio'da olduğu gibi)


Daha önce aynı problemi yaşadım, gerçekten kötü. Jupyter konularına hızlıca baktım ve hiçbir şey bulamadım. IPython (düz python değil) konsolunu çalıştırırsanız da olur mu?
Bzazz

Hangi paketi / modülü kullandınız? Hangi işletim sistemi? Takasın var mı? Jupyter Lab'ın hangi sürümü? Linux olsaydı çekirdek sürümü neydi?
Nizam Mohamed

Çoğunlukla Pandalar, ama paketle ilgili olduğunu düşünmüyorum. İşletim sistemi Ubuntu 16.04.6 LTS'dir ve çekirdek sürümü 4.15.0-65-jeneriktir. Jupyter Lab sürümü 1.0.2'dir. RAM'imin 1.5'i olan 12 GB'a (2 dosyaya atanmış) ayarlanmış bir SWAP'ım var.
Jakes

Yanıtlar:


5

Kesinlikle bu sorunun en sağlam çözümü Docker kaplarını kullanmak olacaktır. Jupyter'a ne kadar bellek ayıracağınızı belirtebilirsiniz ve kabın belleği tükenirse bu çok önemli değildir (sık sık kaydetmeyi unutmayın, ancak söylemeye gerek yok).

Bu blog sizi en çok oraya götürecek. Ayrıca, Jupyter Lab'ı ücretsiz olarak mevcut, resmi olarak bakımı yapılan Jupyter görüntülerinden birinden kurarken bazı iyi talimatlar da vardır:

https://medium.com/fundbox-engineering/overview-d3759e83969c

ve sonra docker runkomutu öğreticide açıklandığı gibi değiştirebilirsiniz (örn. 3GB için):

docker run --memory 3g <other docker run args from tutorial here>

Liman işçisi bellek seçeneklerindeki sözdizimi için şu soruya bakın:

Docker, "--memory" seçeneğini hangi birimi bekliyor?


4

Ubuntu kullanıyorsanız, OOM katillerine göz atın, bilgi alabilirsiniz buraya

Earlyoom'u kullanabilirsiniz . İstediğiniz gibi örneğin yapılandırılabilir earlyoom -s 90 -m 15başlayacak earlyoomve takas boyutu daha az% 90 daha ve bellek az% 15 yerine, nedenleri oom bu süreci öldürmek ve dondurmak için tüm sistemi önleyecektir olduğunda. İşlemlerin önceliğini de yapılandırabilirsiniz.


2

Ayrıca Jupyter Lab'de çok büyük veri kümeleriyle (3GB) çalışıyorum ve aynı sorunu Labs'de yaşıyorum. Önceden dönüştürülmüş verilere erişim sağlamanız gerekip gerekmediği belli değil, eğer değilse, kullanmaya başladımdel ihtiyaç duymadığım takdirde kullanılmayan büyük veri çerçevesi değişkenlerini kullanmaya başladım. deldeğişkenleri belleğinizden kaldırır. Edit **: Karşılaştığım sorun için birden fazla olasılık var. Uzak bir jupyter örneği kullanırken ve daha çok büyük dönüşümler yaparken spyder'da bu daha sık karşılaşıyorum.

Örneğin

df = pd.read('some_giant_dataframe') # or whatever your import is
new_df = my_transform(df)
del df # if unneeded.

Jakes ayrıca büyük veri iş akışlarında bu iş parçacığını yararlı bulabilirsiniz. Dask'a bakıyordumBellek depolamaya yardımcı olması için .

Spyder ve jupyter'da, büyük bir bellek konsolu çalışırken donmanın genellikle başka bir konsolda çalışırken gerçekleşeceğini fark ettim. Neden çökmek yerine neden donmuş olduğuna gelince, bunun çekirdekle bir ilgisi olduğunu düşünüyorum. IPython github'da açık birkaç bellek sorunu var - # 10082 ve # 10117 en alakalı görünüyor. Buradaki bir kullanıcı sekmenin tamamlanmasını devre dışı bırakmayı öneriyorjedi veya güncellemeyi .

10117'de çıktılarını kontrol etmeyi teklif ediyorlar get_ipython().history_manager.db_log_output. Aynı sorunlarım var ve ayarım doğru, ancak kontrol etmeye değer



0

Bence parçalar kullanmalısın. Bunun gibi:

df_chunk = pd.read_csv(r'../input/data.csv', chunksize=1000000)
chunk_list = []  # append each chunk df here 

# Each chunk is in df format
for chunk in df_chunk:  
    # perform data filtering 
    chunk_filter = chunk_preprocessing(chunk)

    # Once the data filtering is done, append the chunk to list
    chunk_list.append(chunk_filter)

# concat the list into dataframe 
df_concat = pd.concat(chunk_list)

Daha fazla bilgi için: https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c

Tekrar bir liste eklememenizi öneririm (muhtemelen RAM tekrar aşırı yüklenir). Döngü için işinizi bitirmelisiniz.


Bence buradaki sorun, belleğin nasıl bitmeyeceği değil, bilgisayarın çökmesini ve yeniden başlatılması gerektiğini nasıl önleyeceğidir. Python çökmeli veya bir bellek hatası atmalı, ama her şeyi mahvetmemelidir.
Bzazz

0

Aşağıdaki sorunun cevaplarını özetleyeceğim . Programınızın bellek kullanımını sınırlayabilirsiniz. Aşağıda bu işlev olacaktır ram_intense_foo(). Aramadan önce işlevi çağırmanız gerekirlimit_memory(10)

import resource
import platform
import sys
import numpy as np 

def memory_limit(percent_of_free):
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024 * percent_of_free / 100, hard))

def get_memory():
    with open('/proc/meminfo', 'r') as mem:
        free_memory = 0
        for i in mem:
            sline = i.split()
            if str(sline[0]) == 'MemAvailable:':
                free_memory = int(sline[1])
                break
    return free_memory

def ram_intense_foo(a,b):
    A = np.random.rand(a,b)
    return A.T@A

if __name__ == '__main__':
    memory_limit(95)
    try:
        temp = ram_intense_foo(4000,10000)
        print(temp.shape)
    except MemoryError:
        sys.stderr.write('\n\nERROR: Memory Exception\n')
        sys.exit(1)

-4

Büyük bir veri çerçevesinin tüm çıktısını görüntülemek için hiçbir neden yoktur. Büyük veri karelerini görüntülemek veya değiştirmek gereksiz yere büyük miktarda bilgisayar kaynağı kullanır.

Yaptığınız her şey minyatür olarak yapılabilir. Veri çerçevesi küçük olduğunda verileri kodlamak ve değiştirmek üzerinde çalışmak çok daha kolaydır. Büyük verilerle çalışmanın en iyi yolu, büyük veri çerçevesinin yalnızca küçük bir kısmını veya küçük bir örneğini alan yeni bir veri çerçevesi oluşturmaktır. Daha sonra verileri keşfedebilir ve kodunuzu daha küçük veri çerçevesinde yapabilirsiniz. Verileri keşfettikten ve kodunuzu çalıştırdıktan sonra, daha büyük veri çerçevesinde bu kodu kullanın.

En kolay yol, head () işlevini kullanarak veri çerçevesindeki ilk n, ilk satır sayısını almaktır. Kafa işlevi yalnızca n, satır sayısını yazdırır. Büyük veri çerçevesindeki başlık işlevini kullanarak mini bir veri çerçevesi oluşturabilirsiniz. Aşağıda ilk 50 satırı seçip değerlerini small_df dosyasına aktarmayı seçtim. Bu, BigData'nın bu proje için açtığınız bir kitaplıktan gelen bir veri dosyası olduğunu varsayar.

library(namedPackage) 

df <- data.frame(BigData)                #  Assign big data to df
small_df <- head(df, 50)         #  Assign the first 50 rows to small_df

Bu çoğu zaman işe yarayacaktır, ancak bazen büyük veri çerçevesi raporlanan değişkenlerle veya önceden gruplandırılmış değişkenlerle birlikte gelir. Büyük veriler böyle ise, büyük verilerden rastgele bir örnek almanız gerekir. Ardından aşağıdaki kodu kullanın:

df <- data.frame(BigData)

set.seed(1016)                                          # set your own seed

df_small <- df[sample(nrow(df),replace=F,size=.03*nrow(df)),]     # samples 3% rows
df_small                                                         # much smaller df
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.