2011-10-19 39 views
6

Nhiều nguồn tôi đã tìm thấy đã gợi ý rằng kích thước của mảng cho mã VBA phụ thuộc vào dung lượng bộ nhớ trong máy. Tuy nhiên, điều này không đúng với tôi. Tôi đang chạy mã sau đây rất đơn giản để kiểm tra:Giới hạn kích thước mảng Excel 2007 VBA

Sub test6() 
Dim arr(500, 500, 500) As Boolean 
End Sub 

Tuy nhiên, nếu tôi thay đổi kích thước thành 600x600x600, tôi sẽ hết lỗi bộ nhớ. Máy tôi đang sử dụng có RAM 16Gb, vì vậy tôi nghi ngờ rằng RAM vật lý là vấn đề.

Tôi đang sử dụng Excel 2007. Có mẹo nào để VBA sử dụng nhiều RAM hơn không?

Trả lời

3

Nó sẽ được tốt đẹp nếu có một Application.UseMoreMemory() chức năng mà chúng ta vừa có thể gọi :-)

Than ôi, tôi biết ai sánh kịp.

Tất cả tài liệu tôi đã thấy nói rằng nó bị giới hạn bởi bộ nhớ nhưng không phải là bộ nhớ vật lý, đó là không gian địa chỉ ảo bạn có sẵn cho bạn.

Bạn nên ghi nhớ rằng, trong khi tăng từ 500 đến 600 chỉ trông giống như tăng vừa phải (mặc dù 20% là đủ lớn), bởi vì bạn đang làm điều đó trong ba chiều, nó hoạt động gần gấp đôi yêu cầu lưu trữ.

Từ bộ nhớ, Excel 2007 sử dụng số nguyên ngắn (16 bit) cho loại boolean, tối thiểu, mảng 500 của bạn sẽ chiếm khoảng 250M (500x500x500x2).

Tăng tất cả các thứ nguyên lên 600 sẽ cung cấp cho bạn 600x600x600x2 hoặc khoảng 432M.

Tất cả cũng trong không gian địa chỉ có thể sử dụng 2G mà bạn có thể có trong một máy 32-bit (Tôi không biết rằng Excel 2007 một phiên bản 64-bit), nhưng những điều này là không nhỏ, và bạn phải chia sẻ không gian địa chỉ đó với những thứ khác.

Thật thú vị khi thấy bạn bị bắt đầu lỗi nào.

Là bước đầu tiên, tôi muốn xem xét sự cần thiết của một mảng lớn như vậy. Nó có thể được thực hiện theo một cách khác, chẳng hạn như phân vùng mảng sao cho chỉ một phần của nó nằm trong bộ nhớ tại bất kỳ thời điểm nào (loại bộ nhớ ảo thủ công). Không có khả năng thực hiện tốt cho truy cập ngẫu nhiên thực sự nhưng không nên quá xấu để truy cập tuần tự hơn và ít nhất sẽ giúp bạn đi (một giải pháp chậm là thích hợp hơn cho một không làm việc).

Một khả năng khác là trừu tượng hóa việc xử lý bit để các boolean của bạn thực sự được lưu trữ dưới dạng các bit thay vì các từ.

Bạn sẽ phải cung cấp các chức năng cho getBoolsetBool, sử dụng toán tử bitmask trên một loạt từ và, hiệu suất sẽ không nóng, nhưng ít nhất bạn cũng có thể tương đương với:

' Using bits instead of words gives 16 times as much. ' 
Dim arr(8000, 8000, 8000) As Boolean 

Như mọi khi, nó phụ thuộc vào những gì bạn cần mảng và mẫu sử dụng của nó.

+0

Mức tăng từ 500 đến 600 chỉ là một công việc khó khăn mà tôi đã làm. Về cơ bản chúng tôi đang cố gắng sử dụng excel cho một cái gì đó mà nó thực sự không được thiết kế cho không may, nhưng thời hạn là vào tuần tới vì vậy chúng tôi không thể thực sự thay đổi ngay bây giờ! Cảm ơn những suy nghĩ, tôi sẽ tiếp tục cắm đi để xem mọi thứ diễn ra ở đâu. – Farthingworth

+0

_Trước khi bạn tiếp tục cắm, bạn có thể muốn đảm bảo quản lý được thông báo về sự chậm trễ tiềm năng này. Họ không thực sự thích bất ngờ :-) – paxdiablo

+0

Lưu ý nhanh về ý tưởng của bạn để sử dụng bit như trái ngược với boolean, tôi đã sử dụng booleans chỉ cho thử nghiệm của tôi, trong công việc thực tế của chúng tôi, chúng tôi đang sử dụng cấu trúc đang nắm giữ một loạt dữ liệu về quá trình, vì vậy chúng tôi nhận được ít hơn nhiều so với những gì chúng tôi có thể nhận được với bools. Tôi đã cắt giảm xuống càng nhiều càng tốt sadly = ( – Farthingworth

0

Khi @paxdiablo đề cập đến kích thước của mảng là khoảng 400 + Mb, với tối đa lý thuyết là 2 Gb cho 32 bit Excel. Hầu hết các macro VBA có thể bị hạn chế trong việc sử dụng bộ nhớ. Ngoài ra khối bộ nhớ cho mảng phải là một khối liên tiếp của bộ nhớ mà làm cho nó phân bổ thậm chí còn khó khăn hơn. Vì vậy, nó có thể là bạn có thể phân bổ mười mảng kích thước 40 Mb, nhưng không phải là một trong 400 Mb kích thước. Kiểm tra nó.

+0

không nên cấp phát bộ nhớ thay đổi khối để tạo ra một không gian liền kề? Nó làm mất thời gian, nhưng tôi không nghĩ rằng nó sẽ ném ra khỏi bộ nhớ lỗi – Juliusz

4

Sau khi chạy một số kiểm tra, có vẻ như có giới hạn khoảng 500MB đối với VBA 32 bit và khoảng 4GB cho VBA 64 bit (Excel 2010-64).
Tôi không biết nếu các giới hạn VBA này giảm nếu bạn đang sử dụng rất nhiều sổ làm việc/bộ nhớ xoay vòng trong cùng một cá thể Excel.

+0

Đó Có thể thử và xem chúng ta có thể có phiên bản 64 bit không - hãy sử dụng máy 64 bit đã được mua nhưng hiếm khi được sử dụng! – Farthingworth

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