2012-01-08 9 views
5

Nie użyłem wcześniej PackedArray, ale zacząłem patrzeć na ich używanie, czytając dzisiaj pewną dyskusję na ich temat.Na PackedArray, szukając porady, jak z nich korzystać

To, co mam, to dużo dużych rozmiarów matryc 1D i 2D wszystkich reali, i bez symbolicznych (jest to skończona różnica PDE), więc pomyślałem, że powinienem skorzystać z użycia PackedArray.

Mam funkcję inicjalizacji, w której przydzielam wszystkie potrzebne dane/siatki. Więc poszedłem i użyłem na nich ToPackedArray. Wydaje się nieco szybszy, ale muszę wykonać więcej testów wydajności, aby lepiej porównać prędkość przed i po, a także porównać wykorzystanie pamięci RAM.

Ale gdy patrzyłem na to, zauważyłem, że niektóre operacje w M automatycznie zwracają listy w PackedArray już, a niektóre nie.

Na przykład ten nie zwrot pakowane tablica

a = Table[RandomReal[], {5}, {5}]; 
Developer`PackedArrayQ[a] 

Ale to robi

a = RandomReal[1, {5, 5}]; 
Developer`PackedArrayQ[a] 

i to robi

a = Table[0, {5}, {5}]; 
b = ListConvolve[ {{0, 1, 0}, {1, 4, 1}, {0, 1, 1}}, a, 1]; 
Developer`PackedArrayQ[b] 

a także matryca mnożenie powoduje zwrotny w zapakowanych tablicy

a = Table[0, {5}, {5}]; 
b = a.a; 
Developer`PackedArrayQ[b] 

But elementu mnożenie nie

b = a*a; 
Developer`PackedArrayQ[b] 

Moje pytanie: Czy istnieje lista gdzieś której dokumenty powrócić polecenia M PackedArray kontra nie? (zakładając, że dane spełniają wymagania, takie jak rzeczywisty, niezmieszany, bez symbolicznego itd.).

Co więcej, mniej istotne pytanie, czy lepiej będzie najpierw sprawdzić, czy stworzona lista/macierz jest już zapakowana przed dzwonieniem pod numer ToPackedArray? Myślę, że wywołanie ToPackedArray na już zapakowanej liście nie będzie kosztować niczego, ponieważ połączenie natychmiast wróci.

Dzięki,

aktualizacji (1)

Chciałem tylko wspomnieć, że właśnie odkryli, że symbole PackedArray niedozwolone w CDF demo jak mam błąd podczas przesyłania jednego z nich. Musiałem więc usunąć cały mój kod pakowania. Ponieważ piszę głównie dema, teraz ten temat jest dla mnie akademicki. Ale chciał podziękować wszystkim za czas i dobre odpowiedzi.

+0

Czy możesz opracować nieco o symbole PackedArray niedozwolone w demo CDF. Może z przykładem? Myślę, że to jest interesujące. –

+0

Cześć, właśnie zrobiłem małą wersję demonstracyjną (arkusz stylów demonstracyjnych itp.) I właśnie zrobiłem małą manipulację i użyłem w niej czegoś takiego jak 'ToPackedArray [Table [0, {10}]]], a następnie przesłałem to moje Obszar tworzenia WRI do generowania demo CDF, ale program do przesyłania WRI (który weryfikuje pliki demonstracyjne przed przesłaniem) odrzucił je, mówiąc, że symbol 'PackedArray' nie jest dozwolony. Zasadniczo ten pakiet nie może być używany w demach. Możesz spróbować sam. Jestem pewien, że istnieją dobre powody, dla których bezpieczeństwo, wsparcie itp., Ale najważniejsze, że PackedArray nie może być użyty w demonstracji WRI przynajmniej na razie – Nasser

+0

ok, więc wygląda na to, że to raczej ekranizacja wolframowa niż całkowite zablokowanie tej funkcji w CDF. Wydaje się to jednak dziwne. –

Odpowiedz

9

Nie ma wyczerpującej listy.Aby zwrócić uwagę na kilka rzeczy:

  • podstawowych operacji na macierzach spakowanych będą miały tendencję do pozostają pakowane:
 
    In[66]:= a = RandomReal[1, {5, 5}]; 

    In[67]:= Developer`PackedArrayQ /@ {a, a.a, a*a} 

    Out[67]= {True, True, True} 
  • Uwaga powyżej, że moja wersja (8.0.4) nie rozpakuj dla mnożenia elementarnego.

  • To czy Table spowoduje wypełnionej tablicy zależy od liczby elementów:

 
    In[71]:= Developer`PackedArrayQ[Table[RandomReal[], {24}, {10}]] 

    Out[71]= False 

    In[72]:= Developer`PackedArrayQ[Table[RandomReal[], {24}, {11}]] 

    Out[72]= True 

    In[73]:= Developer`PackedArrayQ[Table[RandomReal[], {25}, {10}]] 

    Out[73]= True 
  • On["Packing"] włączy wiadomości poinformować, kiedy rzeczy rozpakować:
 
    In[77]:= On["Packing"] 

    In[78]:= a = RandomReal[1, 10]; 

    In[79]:= Developer`PackedArrayQ[a] 

    Out[79]= True 

    In[80]:= a[[1]] = 0 (* force unpacking due to type mismatch *) 

     Developer`FromPackedArray::punpack1: Unpacking array with dimensions {10}. >> 

    Out[80]= 0 
  • Operacje, które robią inspekcję per-elementu zazwyczaj rozpakować tablicę,
 
    In[81]:= a = RandomReal[1, 10]; 

    In[82]:= Position[a, Max[a]] 

     Developer`FromPackedArray::unpack: Unpacking array in call to Position. >> 

    Out[82]= {{4}} 
  • Istnieje kara za nazwanie ToPackedArray na liście już zapakowany jest na tyle mała, że ​​nie będę się martwić o tym zbyt dużo:
 

    In[90]:= a = RandomReal[1, 10^7]; 

    In[91]:= Timing[Do[Identity[a], {10^5}];] 

    Out[91]= {0.028089, Null} 

    In[92]:= Timing[Do[Developer`ToPackedArray[a], {10^5}];] 

    Out[92]= {0.043788, Null} 

  • nakładka woli pakowane do rozpakowanych tablic, które mogą pojawić się przy rozpatrywaniu Dynamic i Manipulate:
 
    In[97]:= Developer`PackedArrayQ[{1}] 

    Out[97]= False 

    In[98]:= Dynamic[Developer`PackedArrayQ[{1}]] 

    Out[98]= True 
  • Patrząc na wydajność, skupić się na przypadkach, w których duże wykazy są coraz rozpakowane, zamiast małych. Chyba że małe są w dużych pętlach.
+0

Kiedy użyłem 'On [" pakowanie "]' Widzę teraz wiele wiadomości wychodzą do konsola teraz, gdy uruchomię moje demo. Podobnie jak w tym 'FromPackedArray :: punpackl1: Rozpakowywanie tablicy o wymiarach {5,5,2} do poziomu 2. 'Ale bez numerów linii i nic więcej, muszę znaleźć, jeśli jest łatwy sposób znaleźć, skąd one pochodzą i czy mogę zmienić kod, aby rzeczy nie zostały rozpakowane? Tylko wiadomości bez pomocy M od miejsca, z którego wyszły, nie są zbyt użyteczne. Mam 7000 linii kodu. Ale to jest początek. Mam więcej pracy do zrobienia teraz :) dzięki – Nasser

+1

@ NasserM.Abbasi, profiluj swój kod, znajdź funkcje, które pochłaniają najwięcej czasu, napraw je; Jestem pewien, że nie masz jednej funkcji z 7KLines kodu ;-) –

+0

@ruebenko, dzięki, ale nie wiem jak profilować kod w M. Jest to JEDNA duża komórka. To jest wersja demo i jest to JEDNA duża komórka manipulacji. Nie wiem, jak użyć Workbench do uruchomienia Manipulate. Zależy również od wejścia interfejsu użytkownika, kod uruchamia inną ścieżkę. Ale chodzi o to, że jeśli M po prostu powie co najmniej nazwę funkcji, z której pochodzi błąd, pomogłoby to. Brak numeru wiersza i nic więcej, wiadomości są dla mnie bezużyteczne, ponieważ trudno się z nich dowiedzieć skąd pochodzą. – Nasser

7

To jest tylko dodatek do Brett's answer:

SystemOptions["CompileOptions"] 

daje długości są używane dla których funkcja zwróci zapakowany tablicę. Jeśli więc trzeba było spakować małą listę, jako alternatywę dla używania Developer`ToPackedArray można tymczasowo ustawić mniejszą liczbę dla jednej z opcji kompilacji. na przykład

SetSystemOptions["CompileOptions" -> {"TableCompileLength" -> 20}] 

Należy również zauważyć pewne różnice między funkcjami, które do mnie przynajmniej nie wydaje się intuicyjny więc generalnie trzeba przetestować tego rodzaju rzeczy, ilekroć ich używać zamiast instynktownie wiedząc, co będzie najlepsze:

f = # + 1 &; 
g[x_] := x + 1; 
data = RandomReal[1, 10^6]; 

On["Packing"] 
Timing[Developer`PackedArrayQ[f /@ data]] 
{0.131565, True} 


Timing[Developer`PackedArrayQ[g /@ data]] 
Developer`FromPackedArray::punpack1: Unpacking array with dimensions {1000000}. 
{1.95083, False} 
4

Kolejny dodatek do odpowiedzi Bretta: Jeśli lista jest spakowaną tablicą, to ToPackedArray jest bardzo szybka, ponieważ sprawdzono dość wcześnie.Również można znaleźć ten cenny:

http://library.wolfram.com/infocenter/Articles/3141/

ogólnie dla Liczby wygląd rzeczy do rozmów z Robem Knapp i/lub Mark Sofroniou.

Kiedy opracowuję kody numeryczne, piszę funkcję, a następnie używam opcji On ["Pakowanie"], aby upewnić się, że wszystko jest zapakowane, co wymaga spakowania.

Odnośnie odpowiedzi Mike'a, próg został wprowadzony, ponieważ w przypadku małych rzeczy jest narzut. Gdzie próg jest zależny od sprzętu. Może warto napisać funkcję ustawiającą ten próg na podstawie pomiarów wykonanych na komputerze.

+1

Czy mogę prosić o wprowadzenie metody pakowania list datowników? Funkcje daty i czasu są zawstydzająco wolne w Mma w stosunku do innych produktów. –

+0

@MikeHoneychurch, myślę, że najlepiej wysłać takie prośby na adres [email protected]; tak, że odpowiedni programista widzi te żądania. –

+0

Niestety WRI wie o tym od lat. Niewielka poprawa prędkości wystąpiła w V8 - kilka% - kiedy to, co jest potrzebne, to 50-100-krotna poprawa. Nie sądzę, że jest traktowany poważnie, ponieważ wydaje się myśleć w kategoriach jednorazowych obliczeń prototypowych - w których spowolnienie nie jest tak zauważalne - zamiast wielkoskalowych produkcji seryjnych - gdzie często jest to krok ograniczający szybkość. Tak więc dochodzi do różnic w nacisku/skupieniu programistów i użytkowników, jak myślę. Przy okazji, gdy dodaję @Ruebenko lub inną nazwę na początku, zostanie ona odcięta po zapisaniu. –

Powiązane problemy