2013-06-26 3 views
0

Я работаю над реорганизацией небольшой части широкомасштабной системы управления конфигурацией для моего университета.Динамическая многомерная структура Java для замены статического многомерного массива

Мы используем некоторые инструменты с открытым исходным кодом для машинного обучения, такие как Weka, и аспект, который я назначил рефактору, имеет дело с интеллектуальными данными и правилами построения.

Файлы с открытым исходным кодом, которые мы использовали из Ливерпуля и Японии, работают хорошо, но есть проблемы с использованием памяти, когда мы используем программу для крупномасштабных проектов.

Я выделил основные ящики памяти и пришел к выводу, что мне нужно выяснить другую структуру данных для хранения и обработки данных. В настоящее время программа использует то, что в конечном итоге становится очень большим многомерным массивом целых чисел, объектов, строк и т. Д.

Существует несколько методов, которые просто перенастраивают настройку ассоциаций после того, как мы выводим правила поведения , Во многих случаях мы добавляем или вычитаем только один элемент или просто сплющиваем многомерные массивы.

В первую очередь я программирую на C/C++, поэтому я не являюсь экспертом в структурах данных, доступных на Java. Я хочу заменить статические массивы динамической структурой, которая может быть легко изменена без необходимости создания второго многомерного массива.

Что происходит сейчас, нам нужно создавать абсолютно новую структуру каждый раз, когда мы добавляем и удаляем правила, объекты или другие разные данные из многомерного массива. Затем мы сразу же копируем новый массив.

Я хотел бы иметь возможность просто использовать один и тот же многомерный массив и просто добавить новую строку и столбец. Впоследствии я хотел бы иметь возможность манипулировать данными в структуре, просто сохраняя временное значение и перезаписывая предыдущие значения, сдвигая влево, вправо и т. Д.

Может кто-нибудь подумать о каких-либо структурах данных в Java, которые бы соответствовали счет?

В соответствующей заметке я просмотрел явную сборку мусора, но обнаружил, что могу реально предложить собирать JVM, вызывая System.Gc() или манипулируя поведением мусорной коллекции JVM с помощью настройки , Есть ли лучший или более эффективный способ?

С уважением, EDM

ответ

0

Там нет многомерной вещи в Java.Java есть массив массивов.

Вы можете использовать ArrayList с параметром типа, как ArrayList

ArrayList<ArrayList<yourType>> myList = new ArrayList<ArrayList<yourType>>(); 

Кроме того, не беспокоиться о GC..It бы собрать как и в случае необходимости ..

+0

Почему бы вам обратиться к Javadoc Java SE 6, а не 7? Почему вы используете переменную типа ArrayList, а не List? «Многомерная вещь» ... хорошо. Поэтому в спецификации также говорится. Тем не менее спецификация продолжает ссылаться на «многомерные массивы» на всем протяжении, а также сообщество разработчиков. Основное различие между Java и другими языками, у которых есть «истинный» многомерный массив, состоит в том, что для многомерных массивов в Java не обязательно иметь массивы одинаковой длины на каждом уровне. –

+0

Когда вы ищете Javadocs, это довольно случайно, если вы получите 6 или 7 (или 5), все они в основном идентичны, поэтому это редко имеет значение. –

0

Я хотел бы посмотреть на используя «Список списков».Например, вы могли бы объявить что-то вроде

List<List<Object>> mArray = new ArrayList<List<Object>>(); 

В любое время вам нужно добавить новый «ряд», вы могли бы сделать что-то вроде:

mArray.add (new ArrayList<Object>()); 

проверить интерфейс List, чтобы увидеть, что вы можете делать с List s в Java и какие классы реализуют интерфейс (или сворачивают ваши собственные!).

1

Если у вас много нулей/нулей/фальшиво/пустых строк в вашей матрице, вы можете сэкономить место, используя реализацию sparse matrix. Matrix-toolkits имеет несколько разреженных матриц, которые вы можете использовать/модифицировать в соответствии с вашими потребностями, или вы можете просто использовать хэш-карту с {x, y} кортежем в качестве ключа. (The HashMap также имеет то преимущество, что существует несколько внешних реализаций Hashmap доступны, например, BerkeleyDB, так что маловероятно, что вы будете бежать из памяти.)

0

Почему бы не использовать два Lists запутанным вместе? Как так:

List<List<String>> rowColumns = new ArrayList<>(); 

// Add a row with two entries, or columns: 
List<String> oneRow = Arrays.asList("Hello", "World!"); 
rowColumns.add(oneRow); 

Кроме того, рекомендуется использовать Map с записями, отображенных в списках.

Сбор мусора обычно не должен быть явно рассмотрен на Java. Обычно вы хотите искать утечки памяти всякий раз, когда вы приходите первым. Когда это произойдет, найдите фоновые потоки, которые не умирают, как предполагалось, или сильные ссылки в кешах. Если вы хотите прочитать некоторые из последних выпусков, вы можете начать here и here.

1

Для замены статических массивов на динамическую структуру используйте ArrayList, который автоматически растет с данными. Для того, чтобы иметь двумерную структуру данных используют List из List в

List<List<Integer>> dataStore = new ArrayList<List<Integer>>(); 
dataStore.add(new ArrayList<Integer>()); 
dataStore.add(Arrays.asList(1, 2, 3, 4)); 

// Access [1][3] as 
System.out.println(dataStore.get(1).get(3)); // prints 4 

Поскольку вы затронули имея контроль над коллекцией мусора (который Java на самом деле делает очень хорошую работу все само по себе), кажется, память управление имеет первостепенное значение, поскольку именно это вызывает перераспределение в первую очередь.

Вы можете изучить шаблон GoF Flyweight, который фокусируется на совместном использовании объектов, а не на повторении их, чтобы сократить объем памяти приложения. Чтобы разрешить совместное использование мухи, необходимо сделать неизменным.

код псевдопользователей:

// adding a new flyweight obj at [2][1] 
fwObjStore.get(2).set(1, FWObjFactory.getInstance(fwKey)); 

public class FWObjFactory { 
    private static Map<String, FWObject> fwMap = new HashMap<String, FWObject>(); 

    public static getInstance(String fwKey) { 
     if (!fwMap.containsKey(fwKey)) { 
      fwMap.put(fwKey, newFwFromKey(fwKey)); 
     } 
     return fwMap.get(fwKey); 
    } 

    private static FWObject newFwFromKey(String fwKey) { 
     // ... 
    } 
} 
+0

Согласен, список списков почти сразу заменит массив. Если вы хотите быть умными, инкапсулируйте списки в класс Matrix и добавьте дженерики и назовите себя счастливыми.Или просто найдите одну из сотен реализаций, которые уже делают именно это. –

+0

@BillK Да, я думаю, что Apache Commons имеет реалии RealMatrix, а Guava Guava имеет общий «Необязательный » в тех же строках. Но у меня не было никакого опыта с ними, чтобы проработать как часть моего ответа. Однако я мог бы добавить их в качестве ссылок. Всегда умнее не изобретать велосипед. –