2012-01-08 25 views
5

Tôi chưa sử dụng PackedArray trước đây, nhưng chỉ bắt đầu xem xét việc sử dụng chúng từ việc đọc một số thảo luận về chúng ở đây ngày hôm nay.Trên PackedArray, tìm kiếm lời khuyên để sử dụng chúng

Những gì tôi có là rất nhiều ma trận 1D và 2D kích thước lớn của tất cả các thực, và không có biểu tượng (nó là một giải pháp PDE khác nhau hữu hạn), và vì vậy tôi nghĩ rằng tôi nên tận dụng lợi thế của việc sử dụng PackedArray.

Tôi có chức năng khởi tạo nơi tôi phân bổ tất cả dữ liệu/lưới cần thiết. Vì vậy, tôi đã đi và sử dụng ToPackedArray trên chúng. Nó có vẻ nhanh hơn một chút, nhưng tôi cần làm thử nghiệm hiệu năng hơn để so sánh tốc độ tốt hơn trước và sau và cũng so sánh việc sử dụng RAM.

Nhưng trong khi tôi đang xem xét điều này, tôi nhận thấy rằng một số hoạt động trong M sẽ tự động trả về danh sách trong PackedArray, và một số thì không.

Ví dụ, này không trở lại đóng gói mảng

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

Nhưng này không

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

này không

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

và cũng nhân ma trận không kết quả trở lại trong mảng đóng gói

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

Nhưng yếu tố nhân khôn ngoan không

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

Câu hỏi của tôi: Có một danh sách ở đâu đó mà tài liệu mà lệnh M trở PackedArray so với không? (giả sử dữ liệu đáp ứng các yêu cầu, chẳng hạn như Thực, không hỗn hợp, không có biểu tượng, vv ..)

Ngoài ra, một câu hỏi nhỏ, bạn có nghĩ rằng tốt hơn nên kiểm tra trước nếu danh sách/ma trận được tạo đã được đóng gói chưa trước khi gọi điện thoại số ToPackedArray trên đó? Tôi sẽ nghĩ rằng gọi số ToPackedArray trong danh sách đã được đóng gói sẽ không mất phí, vì cuộc gọi sẽ trở lại ngay lập tức.

cảm ơn,

cập nhật (1)

Chỉ muốn đề cập đến, mà chỉ phát hiện ra rằng những biểu tượng PackedArray không được phép trong CDF bản demo như tôi đã nhận ra lỗi tải lên một với một. Vì vậy, phải loại bỏ tất cả mã đóng gói của tôi. Vì tôi chủ yếu viết các bản demo, bây giờ chủ đề này chỉ là một mối quan tâm học thuật đối với tôi. Nhưng muốn cảm ơn mọi người về thời gian và câu trả lời hay.

+0

Bạn có thể giải thích một chút về các ký hiệu PackedArray không được phép trong CDF demo hay không. Có lẽ với một ví dụ? Đây là điều tôi quan tâm. –

+0

Xin chào, tôi vừa tạo một bản demo nhỏ (bảng kiểu trình diễn, v.v ...) và chỉ cần thực hiện một thao tác nhỏ và sử dụng một cái gì đó như 'ToPackedArray [Table [0, {10}]]' trong đó, và sau đó tải nó lên Vùng tác giả WRI để tạo một CDF demo nhưng trình tải lên WRI (xác minh tệp demo trước khi tải lên) đã từ chối nó nói rằng biểu tượng 'PackedArray' không được phép. Vì vậy, về cơ bản gói này không được phép sử dụng trong trình diễn. Bạn có thể tự mình thử. Tôi chắc chắn có lý do chính đáng tại sao, an ninh, hỗ trợ, vv ... nhưng dòng dưới cùng, PackedArray không thể được sử dụng trong một cuộc biểu tình WRI ít nhất là bây giờ – Nasser

+0

ok vì vậy điều này giống như một số loại sàng lọc mà Wolfram đang làm so với một tấm chăn chặn chức năng đó trong CDF. Điều đó có vẻ lạ. –

Trả lời

9

Không có danh sách toàn diện.Để chỉ ra một vài điều:

  • hoạt động cơ bản với mảng đóng gói sẽ có xu hướng vẫn đóng gói:
 
    In[66]:= a = RandomReal[1, {5, 5}]; 

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

    Out[67]= {True, True, True} 
  • Lưu ý ở trên rằng phiên bản của tôi (8.0.4) không giải nén cho phép nhân phần tử.

  • Cho dù một Table sẽ cho kết quả trong một mảng đóng gói phụ thuộc vào số lượng các yếu tố:

 
    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"] sẽ bật tin nhắn cho bạn biết khi mọi việc giải nén:
 
    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 
  • Operations mà làm kiểm tra cho mỗi yếu tố thường sẽ giải nén mảng,
 
    In[81]:= a = RandomReal[1, 10]; 

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

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

    Out[82]= {{4}} 
  • Có hình phạt cho gọi ToPackedArray trên một danh sách đã được đóng gói là đủ nhỏ rằng tôi sẽ không lo lắng về nó quá nhiều:
 

    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} 

  • Các frontend lại thích đóng gói để mảng giải nén, có thể xuất hiện khi giao dịch với DynamicManipulate:
 
    In[97]:= Developer`PackedArrayQ[{1}] 

    Out[97]= False 

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

    Out[98]= True 
  • Khi nhìn vào hiệu suất, tập trung vào trường hợp các danh sách lớn đang nhận được giải nén, chứ không phải là những cái nhỏ. Trừ khi những người nhỏ đang ở trong vòng lớn.
+0

Khi tôi sử dụng 'Ngày [" đóng gói "]' Tôi thấy bây giờ rất nhiều tin nhắn đi ra giao diện điều khiển ngay bây giờ khi tôi chạy bản trình diễn của mình. Như thế này 'FromPackedArray :: punpackl1: Unpacking mảng với kích thước {5,5,2} đến cấp 2.' Nhưng không có số dòng và không có gì khác, tôi cần phải tìm nếu có một cách dễ dàng để tìm thấy từ nơi này đang đến và xem tôi có thể thay đổi mã để mọi thứ không được giải nén không? Chỉ các tin nhắn không có sự trợ giúp từ M là từ nơi chúng xuất hiện không quá hữu ích. Tôi có 7.000 dòng mã. Nhưng đó là một sự khởi đầu. Tôi có nhiều việc phải làm bây giờ :) cảm ơn – Nasser

+1

@ NasserM.Abbasi, hãy lập hồ sơ cho mã của bạn, tìm các hàm tiêu thụ hầu hết thời gian, sửa những thứ đó trước tiên; Tôi chắc chắn bạn không có một chức năng với 7KLines mã ;-) –

+0

@ruebenko, cảm ơn nhưng tôi không biết làm thế nào để cấu hình mã trong M. Nó là một tế bào lớn. Đây là một bản demo, và nó là một tế bào Manipulate lớn. Tôi không biết cách sử dụng bàn làm việc để chạy Thao tác. Nó cũng phụ thuộc vào đầu vào giao diện người dùng, mã chạy đường dẫn khác nhau. Nhưng vấn đề là, nếu M chỉ đơn giản là sẽ nói ít nhất tên hàm trong đó lỗi xuất phát, nó sẽ giúp ích. Không có số dòng và không có gì khác, các thông điệp là khá vô dụng đối với tôi, vì khó biết từ nơi họ đến. – Nasser

7

Đây chỉ là một phụ lục để Brett's answer:

SystemOptions["CompileOptions"] 

sẽ cung cấp cho bạn độ dài được sử dụng mà một hàm sẽ trả về một mảng đóng gói. Vì vậy, nếu bạn cần phải đóng gói một danh sách nhỏ, thay vì sử dụng Developer`ToPackedArray, bạn có thể tạm thời đặt một số nhỏ hơn cho một trong các tùy chọn biên dịch. ví dụ.

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

Cũng lưu ý một số sự khác biệt giữa các chức năng đó với tôi ít nhất dường như không trực quan vì vậy tôi thường phải kiểm tra các loại điều bất cứ khi nào tôi sử dụng chúng chứ không phải là bản năng biết những gì sẽ làm việc tốt nhất:

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

Một bổ sung khác cho câu trả lời của Brett: Nếu một danh sách là một mảng được đóng gói thì một ToPackedArray là rất nhanh vì điều này được kiểm tra khá sớm.Ngoài ra bạn có thể tìm thấy điều này có giá trị:

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

Nói chung cho numerics thứ nhìn cho cuộc đàm phán từ Rob Knapp và/hoặc Mark Sofroniou.

Khi tôi phát triển mã số, tôi viết chức năng và sau đó sử dụng On ["Packing"] để đảm bảo rằng mọi thứ được đóng gói cần phải được đóng gói.

Liên quan đến câu trả lời của Mike, ngưỡng đã được giới thiệu vì những thứ nhỏ có phí. Nơi ngưỡng là phụ thuộc phần cứng. Nó có thể là một ý tưởng để viết một hàm đặt ngưỡng này dựa trên các phép đo được thực hiện trên máy tính.

+1

Tôi có thể thực hiện một lời cầu xin cho một phương pháp để đóng gói DateLists được giới thiệu. Các hàm ngày tháng và thời gian rất chậm chạp trong Mma so với các sản phẩm khác. –

+0

@MikeHoneychurch, tôi nghĩ bạn nên gửi những yêu cầu đó đến [email protected]; sao cho nhà phát triển thích hợp thấy các yêu cầu này. –

+0

Thật không may WRI đã biết về điều này trong nhiều năm. Một sự cải thiện nhỏ trong tốc độ xảy ra trong V8 - một vài% - khi những gì cần thiết là cải thiện 50-100 lần. Tôi không nghĩ rằng nó được thực hiện nghiêm túc bởi vì họ dường như suy nghĩ về một trong những tính toán prototyping off - nơi chậm chạp không phải là đáng chú ý - chứ không phải là công việc sản xuất hàng loạt quy mô lớn - nơi nó thường là tỷ lệ hạn chế bước. Vì vậy, nó được giảm xuống một sự khác biệt trong sự nhấn mạnh/tập trung của các nhà phát triển so với người dùng tôi nghĩ. BTW khi tôi thêm @Ruebenko hoặc tên khác vào lúc bắt đầu, nó được cắt nhỏ khi tôi lưu. –

Các vấn đề liên quan