Maximum array size in MATLAB?

前端 未结 4 852
-上瘾入骨i
-上瘾入骨i 2021-01-02 22:15

I\'m writing a MATLAB program that will generate a matrix with 1 million rows and an unknown amount of columns (at max 1 million).

I tried pre-allocating this matrix

相关标签:
4条回答
  • 2021-01-02 22:25

    The Limits

    There are two different limits to be aware of:

    1. Maximum array size (in terms of number of elements) allowed by MATLAB, regardless of current memory availability.
    2. Current bytes available for a single array -- the (current) maximum possible array size in bytes.

    The first limit is what causes "Maximum variable size allowed by the program is exceeded", not the second limit. However the second one is also a practical limit of which you must be aware!

    Checking the Limits

    The maximum number of elements allowed for an array is checked as follows:

    >> [~,maxsize] = computer
    maxsize =
       2.8147e+14
    

    According to the documentation for the computer command, this returns:

    maximum number of elements allowed in a matrix on this version of MATLAB

    This is a static MATLAB limit on number of elements, not affected by the state of the computer (hardware specs and current memory usage). And at over 2 petabytes for a double array of that length, it's also way higher than any computer of which I am aware!

    On the other hand, the largest practical array size that you can create at any given moment can be checked by the memory command:

    >> memory
    Maximum possible array:     35237 MB (3.695e+10 bytes) *
    Memory available for all arrays:     35237 MB (3.695e+10 bytes) *
    Memory used by MATLAB:      9545 MB (1.001e+10 bytes)
    Physical Memory (RAM):     24574 MB (2.577e+10 bytes)
    
    *  Limited by System Memory (physical + swap file) available.
    

    As the message says, these values are based on actual current memory availability, taking into account both physical memory and the swap file (collectively, virtual memory).

    If needed, these values can accessed programmatically by m = memory;.

    Adjusting the Limits

    The first limit (the hard limit) has been fixed up until R2015a, where it can now be changed (but only reduced to a fraction of system memory) through the following setting:

    enter image description here

    You can't increase it beyond your system limits.

    The second limit obviously has no "setting" in MATLAB since it's based on available memory and computer configuration. Aside from adding RAM, there's not a lot you can do: (1) pack to consolidate workspace memory and perform "garbage collection", but this may only help on certain platforms, and (2) increasing page file size to allow other stuff to swap out and give MATLAB more physical memory. But be cautious when relying on your page file as your computer may become unresponsive if page file thrashing happens.

    0 讨论(0)
  • 2021-01-02 22:28

    In older versions of Matlab that don't include the memory command, you can use:

    feature memstats

    Physical Memory (RAM):
        In Use:                              738 MB (2e2c3000)
        Free:                                273 MB (11102000)
        Total:                              1011 MB (3f3c5000)
    Page File (Swap space):
        In Use:                             1321 MB (529a4000)
        Free:                               1105 MB (45169000)
        Total:                              2427 MB (97b0d000)
    Virtual Memory (Address Space):
        In Use:                              887 MB (37723000)
        Free:                               1160 MB (488bd000)
        Total:                              2047 MB (7ffe0000)
    Largest Contiguous Free Blocks:
         1. [at 4986b000]                    197 MB ( c585000)
         2. [at 3e1b9000]                    178 MB ( b2a7000)
         3. [at 1f5a0000]                    104 MB ( 6800000)
         4. [at 56032000]                     77 MB ( 4d3e000)
         5. [at 68b40000]                     70 MB ( 4660000)
         6. [at 3a320000]                     54 MB ( 3610000)
         7. [at 63568000]                     45 MB ( 2d48000)
         8. [at 35aff000]                     40 MB ( 2821000)
         9. [at 60f86000]                     37 MB ( 25ca000)
        10. [at 6f49d000]                     37 MB ( 25b3000)
                                            ======= ==========
                                             842 MB (34ac0000)
    
    ans =
    
       207114240
    

    You can't suppress the output, but it returns the largest memory block available ( 207,114,240 Bytes / 8 = 25,889,280 doubles )

    0 讨论(0)
  • 2021-01-02 22:35

    Take a look at this page, it lists the maximum sizes: Max sizes

    It looks to be on the order of a few hundred million. Note that the matrix you're trying to create here is: 10e6 * 10e6 = 10e12 elements. This is many orders of magnitude greater than the max sizes provided and you also do not have that much RAM on your system.

    My suggestion is to look into a different algorithm for what you are trying to accomplish.

    0 讨论(0)
  • 2021-01-02 22:48

    To find out the real maximum array size (Windows only), use the command user = memory. user.maxPossibleArrayBytes shows how many bytes of contiguous RAM are free. Divide that by the number of bytes per element of your array (8 for doubles) and you know the max number of elements you can preallocate.

    Note that as woodchips said, Matlab may have to copy your array (if you pass by value to a subfunction, for example). In my experience 75% of the max possible array is usually available multiple times.

    0 讨论(0)
提交回复
热议问题