2013-06-07 5 views
5

Я новичок в Java, поэтому я не уверен, какой выбор структуры данных будет хорош здесь. Я буду хранить данные акселерометра, гироскопа и магнитометра (9 значений) в списке, который будет использоваться позже для сглаживания, отображения и обработки некоторых сигналов.Какая структура данных разумна для данных временных рядов в Java?

Моя идея - создать объект MyObject, который имеет десять членов: метку времени и девять значений ориентации/движения, все они плавают. Затем я сохраню данные в файле ArrayList<MyObject>. Это хорошая идея или я что-то пропустил?

Этот список будет содержать не более 100 тыс. Значений.

+0

Есть ли возможность одновременного доступа? – fge

+0

@fge Нет, все будет работать в одном потоке. – Andreas

+0

Ну, тогда ArrayList в порядке.Но значения 100k довольно значительны, вы пишете их в постоянное хранилище перед обработкой или обрабатываете их во время работы? – fge

ответ

1

Используйте TreeMap, чтобы начать улучшать производительность поиска.

TreeMap

Примечание (в документации):

Эта реализация обеспечивает гарантированную журнала (п) затраты времени на ContainsKey, получить, поставить и удалить операции.

+5

Если последовательность данных хранится в порядке, 'ArrayList' быстрее ... – fge

+0

@fge Для n = 100k, n против log (n), log (n) = 5 и n = 100 000. Если бы я искал для определенного предмета, и это был последний элемент, который мне пришлось бы искать по 100 000 предметов, чтобы соответствовать последнему пункту. Возможно, Hashmap атрибутов может создать индекс в ArrayList, чтобы обеспечить доступ к индексу 1-го шага. Не слишком уверен, как отсортированный arraylist может обеспечить более быстрый доступ, если вы не знаете индекс для пункта, который вы ищете? – Excalibur2000

+0

Читать комментарии: ему не нужно обращаться к данным в своей программе, только хранить их, обработка выполняется позже. Таким образом, ему нужна структура данных с «быстрой вставкой». Для этого «TreeMap» является излишним. – fge

0

Создание собственного класса - это правильный путь. Теперь для хранения объектов этого класса ...

Если вам нужен прямой поиск (например, «дайте мне 5-й объект») на объекты, когда у вас есть все, используйте ArrayList. Но если вы просто будете перебирать все объекты по порядку, вы должны рассмотреть возможность использования linked list.

Класс ArrayList использует примитивный массив, который будет расти по мере необходимости для размещения элементов, которые вы добавляете к нему. Когда он вырабатывает свою внутреннюю структуру, ему необходимо выделить новый массив и скопировать все исходные значения. Это может быть дорогостоящим (особенно с элементами 100K!). Вы можете дать ему первоначальный размер, чтобы дать ему больше времени, прежде чем он должен расти; но если вам не нужно столько места, внутренний массив ArrayList может растратить большой кусок памяти.

Добавление элементов в связанный список практически ничего не стоит, потому что «рост» не нужен; он просто добавляет еще один узел в список. Но вы не можете искать предметы по их индексу. Вам нужно будет начинать с первого элемента и перебирать список в нужный элемент.

0

Вы можете рассмотреть возможность использования выходной файл потока для вывода данных напрямую, а не хранить его в некоторой структуре данных:

output = new BufferedWriter(new FileWriter("output.csv")); 

while(dataSource.stillHasData()) 
    output.println(dataSource.getData().toString()); 

output.close(); 

Использование BufferedWriter гарантирует, что программа не должна ждать запись диска происходит до того, как она сможет взять следующие данные, поэтому это будет приемлемо для сбора живых данных (обычно).

Затем вы должны сделать что-то вроде этого в классе данных:

public String toString(){ 
    StringBuilder buf = new StringBuilder(); 

    buf.append(timeStamp); str.append(','); 
    // ... 
    // append all the other data 

    return buf.toString(); 
} 

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