güncelleme ederiz: sürümü 0.19.0 ile başlayarak, get_dummies birçok durumda bu sorunu çözecektir 8bit tamsayı yerine 64bit float, döndürür. Bkz. get_dummies -- pandas 0.19.0
İşte denemek için birkaç olasılık var. Her ikisi de, veri çerçevesinin bellek ayak izini önemli ölçüde azaltacaktır, ancak daha sonra bellek sorunlarıyla karşılaşabilirsiniz. Tahmin etmek zor, sadece denemek zorundasın.
df = pd.DataFrame({ 'itemID': np.random.randint(1,4,100) })
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64
memory usage: 3.5 KB
(aşağıda info()
çıktısını basitleştirilmesi ediyorum unutmayın) İşte ana çizgisi. Her bir kukla sütun 800 bayt alır çünkü örnek verisi 100 satır ve get_dummies
float64 (8 bayt) varsayılan olarak görünür. Bu, mankenleri saklamak için gereksiz yere kullanamayacak kadar gereksiz bir yol gibi gözüküyor, ama bunu yapabilmem için bir sebep olabilir.
Yani, ilk girişim, sadece bu yüzden astype(np.int8)
ile dönüşüm olarak yapılmalıdır get_dummies
için bir seçenek olarak görünmemektedir (tek bayt tamsayıya değiştirin.
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_').astype(np.int8)],
axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null int8
itemID__2 100 non-null int8
itemID__3 100 non-null int8
memory usage: 1.5 KB
Her kukla sütun Şimdi daha önce olduğu gibi bellek 1/8 sürer.
Alternatif olarak, get_dummies
ait sparse
seçeneğini kullanabilirsiniz.
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_',sparse=True)],
axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64
memory usage: 2.0 KB
Oldukça karşılaştırılabilir tasarruf. info()
çıktısı bir şekilde tasarrufların meydana gelme şeklini gizler, ancak toplam tasarrufları görmek için bellek kullanımının değerine bakabilirsiniz.
Bunlardan hangisinin pratikte daha iyi çalışacağını söylemek zor (eğer pratik bir çözümse), bu yüzden her birini denemeniz gerekir. Teoride, iki yaklaşımı bile birleştirebilirsiniz, ancak her bir yaklaşımın kendi başına işlediği sürece bunu denemem.
32 bit veya 64 bit Python? Sınır, Python uygulamasının RAM boyutu değil sanal bellek alanı olan yığın boyutudır. Farklı işletim sistemleri üzerindeki farklı sürümler ve farklı uygulamaların hepsi farklı sınırlamalara sahiptir.Açıkçası bir tane vurdun. Tüm bu verileri sanal bellekte aynı anda mı saklamak zorundasınız? – cdarke
64 bit Python kullanıyorum. Bunun çözümü ne olurdu? Veri setini birden fazla parçaya böldüğümü ve bu farklı bölümlerde çalışmamı yaptım mı? – Duesentrieb
Tamam, ben 32-bit olsaydı ben önereceğim. Bu durumda tasarımınızı tekrar gözden geçirmeniz gerekir. – cdarke