Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Большие массивы


Автор: Rosomaha 13.5.2009, 22:08
Нужно выделить память под большой массив:
Код
float[,] _weight;
int NnInLayer = 2250000;
_weight = new float[NnInLayer, NnInLayer + 1];


возникает OutOfMemoryException
возможно ли вообще выделить память под массив такой размерности?

Автор: NightmareZ 13.5.2009, 22:33
Не нужно так делать.

Автор: Rififi 13.5.2009, 23:50
Rosomaha, 
возможно ли вообще выделить память под массив такой размерности? 
возможно.
для этого нужно иметь 64-битную OS, и компьютер с 32 терабайтами памяти.

Автор: Ctrl 14.5.2009, 10:04
Цитата

возможно ли вообще выделить память под массив такой размерности?

Другой вопрос - а нужно ли?

В реальных задачах скорее всего такой массив в большей своей части будет пустой (например электронная таблица 100000X1000).
Воспользуйся разреженным массивом (SparseArray).
Вот очень простая его реализация (через hash):


Код

using System;
using System.Collections.Generic;

namespace SimpleSparceArrayTest {
    class Program {
        static void Main(string[] args) {
            SparseArray<int> sArray = new SparseArray<int>();
            sArray[2500, 550] = 5;
            sArray[550, 2500] = 10;
            int a = sArray[0, 999999];
            int l = sArray.Length;
        }
    }
    public class SparseArray<T> {
        Dictionary<Key, T> contentHash;
        public SparseArray() {
            contentHash = new Dictionary<Key, T>();
        }
        public int Length {
            get { return contentHash.Count; }
        }
        // TODO: ICollection<T> etc.
        public T this[int i, int j] {
            get {
                T value;
                if(!contentHash.TryGetValue(new Key(i, j), out value)) {
                    value = default(T);
                }
                return value;
            }
            set { contentHash[new Key(i, j)] = value; }
        }
        #region Key
        class Key {
            readonly int I, J, _hash;
            public Key(int i, int j) {
                I = i; J = j;
                _hash = I.GetHashCode() ^ J.GetHashCode();
            }
            public override bool Equals(object obj) {
                Key key = obj as Key;
                return (key != null) && (I == key.I) && (J == key.J);
            }
            public override int GetHashCode() { return _hash; }
        }
        #endregion Key
    }
}


Автор: -Mikle- 15.5.2009, 07:26
2'250'000 * 2'250'001 * 4 = 20'250'009'000'000 байт = 20.25 Терабайт... не слабо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)