2011-01-20 13 views
8

Bazı temel performans ve bellek tüketimi kriterler yaptık ve daha da hızlı bir şeyler yapmak için herhangi bir yolu olup olmadığını merak ediyorum ... Yalnızca oku kilitle Python'da liste var mı?

  1. Bir numpy ndarray dev 70,000 eleman listesi var ve Söz konusu listedeki bir tuple içindeki dosya yolu.

  2. Benim ilk sürümü piton çok işlemli modülünde süreçlerin her birine listesinin bir doğradı kopyasını geçti ama 20 + GB

  3. ben içine taşındı ikinci versiyonu için ram kullanımını patlayabilir global uzayı ve indeks aracılığıyla indeks aracılığıyla erişirim (i) süreçlerimin her birinde bir döngü içinde bir bellek alanı/CoW semantiği haline getirmiş gibi görünen süreçlerle birlikte bellek kullanımını patlatmaz (Stays at ~ 3 Gigabaytlar)

  4. Ancak, performans ölçütlerine göre, uygulama zamanının büyük çoğunluğu artık "satın alma" olarak harcandığı anlaşılıyor. mod ...

    Yani ben nasılsa lockfree çeşit Bu listeyi açmak gibi bir ihtimal var olup olmadığını merak edildi

/I hızlandırmak için acquire adımın bir parçası ile deplasmanda yapabileceği tek böylece okundu daha fazla erişim.

Düzenleme 1: bundan böyle Ardından

# Sample code for a rough idea of how the list is constructed 
sim = [] 
for root, dirs, files in os.walk(rootdir): 
    path = os.path.join(root, filename) 
    image= Image.open(path) 
    np_array = np.asarray(image) 
    sim.append((np_array, path)) 

# Roughly it would look something like say this below 
sim = List((np.array([[1, 2, 3], [4, 5, 6]], np.int32), "/foobar/com/what.something")) 

: Liste yapısının bir örneği İşte ediyor: İşte app

ncalls tottime percall cumtime percall filename:lineno(function) 
    65 2450.903 37.706 2450.903 37.706 {built-in method acquire} 
39320 0.481 0.000 0.481 0.000 {method 'read' of 'file' objects} 
    600 0.298 0.000 0.298 0.000 {posix.waitpid} 
    48 0.271 0.006 0.271 0.006 {posix.fork} 

Düzenleme 2'nin profilleme üst birkaç satır çıkışı var SIM listesi sadece okunmalıdır.

cevap

10

multiprocessing modülü tam olarak gereksinim duyduğunuz şeyi sağlar: isteğe bağlı kilitleme ile paylaşılan bir dizi, yani multiprocessing.Array sınıfı. Kilitlemeyi devre dışı bırakmak için yapıcıya lock=False'u geçin.

Düzenleme (güncellemeniz hesaba katılarak): İşler aslında başlangıçta beklediğimden çok daha fazla söz konusu. Listenizdeki tüm öğelerin verileri paylaşımlı bellekte oluşturulmalıdır. Paylaşılan bellekte listenin kendisini (yani gerçek verilere ilişkin işaretçileri) koyarsanız, çok fazla önemi yoktur çünkü bu, tüm dosyaların verilerine kıyasla küçük olmalıdır. Paylaşılan hafızada dosya veri depolamak data Dosyadan okunan verileri ise

shared_data = multiprocessing.sharedctypes.RawArray("c", data) 

kullanın. , Işlemlerin birinde bir NumPy dizi olarak kullanmak paylaşılan veri için bir NumPy dizi görünüm yaratacaktır

numpy.frombuffer(shared_data, dtype="c") 

kullanın. Benzer bir şekilde, paylaşılan belleğe yol adını koymak yol sıradan Python dize olan

shared_path = multiprocessing.sharedctypes.RawArray("c", path) 

kullanmak. Süreçlerinizde, bu bir Python dizesi olarak shared_path.raw kullanarak erişebilirsiniz. Şimdi listenize (shared_data, shared_path) ekleyiniz. Liste diğer süreçlere kopyalanacak, ancak gerçek veriler olmayacak.

İlk olarak, gerçek liste için bir multiprocessing.Array kullanmam gerekiyordu. Bu mükemmel bir şekilde mümkün olacaktır ve listenin kendisinin (yani verilere işaret edenlerin) paylaşılmış bellekte olmasını da temin eder. Şimdi, gerçek veriler paylaşıldığı sürece bunun hiç de önemli olmadığını düşünüyorum.

+0

Sorunum, numpy ndarray + dosya yolunu depolamanın bir yoluna ihtiyacım var. Array öğelerini anladığımda, yalnızca "c" gibi "element" ("char") depolayamayacağı 1 öğe depolanıyor. – Pharaun

+0

@Pharaun: Belki de listenizin yapısını doğru bir şekilde alamadım. Sorunuzda bunu daha açık hale getirebilir misiniz? Eminim 'Array' sınıfı uygulamanız için kullanılabilir. –

+0

@Sven, Yukarıdaki soru, listenin edit2 altında nasıl oluşturulduğunun kaba bir örneğiyle güncelledim, bu yüzden bir fikir vermeliyim ... – Pharaun

İlgili konular