2013-01-15 12 views
9

Sadece Matlab ve bilgisayarı yeniden başlattıktan sonra, bu basitleştirilmiş kod artık benim için problem iyi üretmesi keşif yaptıNeden temp olarak adlandırılan bir klasöre kaydetme, Matlab'da bir for döngüsünde yavaşlamak için veri yüklemesine neden oluyor?

ÖNEMLİ GÜNCELLEME ya ... Ben değil mi 'bir komut dosyası ile vaktini alıyorum için çok üzgünüm Çalış. Ancak, eski '' '' 'iç döngüde herhangi bir klasörde (denedim) herhangi bir şey kaydedersem eski yazı benim hala devam ediyor. Benim amacım gereği, kesinlikle ihtiyacım olmadıkça bunu kurtarmamaya çalıştım.

tam olarak çalıştırırsanız
load() % .mat files, size 365x92x240 
for day = 1:365 
    load() % .mat files, size 8x92x240 

    for type = 1:17 
     load() % .mat files size 17x92x240 
     load() % .mat files size 92x240 

     for step 1:8 
      %only calculations 
     end 
     save() % .mat files size 8x92x240 

    end 
    save() % .mat files, size 8x92x240 
end 

% the load and saves outside the are in for loops too, but do not seem to affect the described behavior in the above script 
load() % .mat files size 8x92x240 
save() % .mat files size 2920x92x240 
load() 
save() % .mat files size 365x92x240 
load() 
save() % .mat files size 12x92x240 

, script yaklaşık kaydeder: özgün senaryo save veya load aşağıdaki for döngüler bakımından yapısını ve kullanımı vardır. 10 Gb ve yükler yakl. 2 GB veri.

Tüm komut dosyası oldukça uzun ve çok fazla tasarruf ve yük getiriyor. Maalesef, sorunu indirgenmiş bir versiyonda yeniden üretmeyi başarmadan önce, burada çok pratik olmazdı. Aynı kodun zaman zaman farklı davranabileceğini hayal kırıklığına uğramış olarak keşfettiğimde, davranışı tutarlı bir şekilde yeniden üreten bir sadeleştirme bulması beklenenden daha sıkıcıydı. Sorunu üreten yönetilebilir bir kod hakkında emin olduğumda geri döneceğim.


ÖNCEKİ PROBLEM TANIMI (NB emin anlatılan sorunu yeniden gelmez için aşağıdaki kodu..):

Sadece Matlab, bir tasarruf isim olamaz, o zor yoldan öğrendim Döngüyü bir sonraki turda veri yüklemeyi yavaşlatmadan, for döngüsünde temp klasörüne geçin. Benim sorum neden?

Sorunu kendiniz çoğaltmak istiyorsanız, lütfen aşağıdaki kodlara bakın. Çalıştırmak için, isimli bir any.mat.ile adlı bir matbala ve kaydetme için iki klasör, temp ve geçici geçici olarak adlandırılan bir matbala ihtiyacınız olacaktır.

clear all;clc;close all;profile off; 
profile on 

tT= zeros(1,endDay+1); 
tTD= zeros(1,endDay+1); 

for day = 0:2; 
    tic 
    T = importdata('anyData.mat') 
    tT(day+1)=toc; %loading time in seconds 

    tic 
    TD = importdata('anyData.mat') 
    tTD(day+1)=toc; 

    for type = 0:1 
     saveFile = ones(92,240); 

     save('AnyFolder\temporary\saveFile.mat', 'saveFile') % leads to fast data loading 
     %save('AnyFolder\temp\saveFile.mat', 'saveFile') %leads to slow data loading 

    end % end of type 

end% end of day 

profile off 
profile report 

plot(tT) 

Veri yükleme önemli ölçüde daha uzun zaman alır o komplo y ekseni göreceğimiz zaman sıcaklığına ziyade geçici tasarruf sonra for döngü içinde. Bunun neden oluştuğunu bilen var mı?

+4

garip görünüyor. Kesinlikle yeniden üretemez. Belki de verilerinizi yükleyebilirsiniz. Ayrıca, daha ayrıntılı bir örnek oluşturmak için - neden kullanılmayan tüm importdata komutlarını kaldırmıyorsunuz? – bdecaf

+1

Hayır, burada tekrarlanamaz. Aslında, "temp" kullanarak daha hızlıdır ... –

+2

Matlab sürümü, işletim sistemi, depolama türü ...? –

cevap

0

burada

  1. iki şey Depolama genellikle bir dosya akışı açar ve hareket önce kapatır olarak for döngüsü, pahalı bir işlemdir sırasında vardır. Bundan kaçınamayabilirsiniz.
  2. İkinci şey depolama hızı ve önbellek hızıdır. Muhtemelen programlar geçici dosyaları kendi geçici dosyaları için kullanırlar ve bunları temizlemek için bunlara bakan bir çöp kutusu veya yazılımı vardır. Dosya akışını bu klasöre açmaya ve kapatmaya başlarsanız, klasöre özel yazma erişimi almak için bir talep göndermeniz gerekir. Bu tekrar zaman ekler.

Görüntü işleme işlemleri yapıyorsanız ve çok sayıda resminiz varsa, hız, önbellek ve mevcut bellek MATLAB için kullanılabilir olduğundan, sabit sürücüye yazarak bir şişe boynuna girebilirsiniz.

0

Sorunu yeniden oluşturamıyorum, sistem ve veri boyutuna özgü olduğundan şüpheleniyorum. Ancak bu durumun size yardımcı olabileceği bazı genel yorumlar:

Yorum yapanlar ve yukarıdaki cevaplar tarafından belirtildiği gibi, özellikle de erişmeniz gereken durumlarda, çift döngü içinde dosya i/o aşırı derecede parazit olabilir. dosyadaki verilerin, diğer sistem işlemlerinin işlemi geciktirdiği veya veri dosyalarının sanal bellek (windows)/takas alanı (linux) gerektirecek kadar büyük olduğu durumlarda bunları yükler. İkinci durumda, açtığınızda bir dosyayı sabit diskin bir kısmından diğerine taşıdığınız bir durumda olabilirsiniz!

Yükleme/kaydetme yaptığınızı farz edelim çünkü hesaplama için bellekte her şeyi tutmak için yaklaşık 10 GB RAM kullanmıyorsunuz. Asıl sorun açıklanmadı, bu yüzden emin olamıyorum, ancak matfile sınıfının yararlı olabileceğini düşünebilirsiniz ... TMW documentation. Bu, bir mat dosyasına doğrudan/eşlemek için kullanılır. Bu:

  • keyfi büyük değişken boyutlarda

  • verir (disk boyutu değil, bellek tarafından yönetilen) Eğer okuma/kısmen yazmasına olanak tanır dosya akışı açılış ve kapanış IOPS azaltır (yazma yani tüm dosya yüklemeden bir dizinin yalnızca bazı öğeleri) Mat dosyası dosyanızın bellekte saklanmayacak kadar büyük olması durumunda, son derece değiştirilecek takas alanına yüklenmemesi için

  • hantal.

Bu yardımcı olur umarım. Tom

İlgili konular