Есть ли способ хранения точек данных вместо создания многомерного массива? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь прочитать доступные данные и записать их в файл NetCDF.Скажем, я считываю температуру по разным значениям времени, глубины, широты и долготы, мне придется создать целую 4D сетку времени, глубины, широты и долготы в виде измерений.

Однако данные, которые я записываюимеет значения в очень немногих точках.Например, в одном из случаев у меня были данные в 155 точках, в то время как сетка имела размер 50x16x16x18 по времени, широте и долготе соответственно.Таким образом, у меня были данные только в 155 точках из сетки, имеющей 230400 ячеек.Остальные точки имеют значения заполнения.

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

Я использую для этого библиотеку Java NetCDF.

Большое спасибозаранее.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Должна быть возможность представлять данные в каждой точке сетки, используя одну из геометрий дискретной выборки (DSG), обозначенную Соглашениями CF (вот некоторые примеры ). Возможно, одно из этих представлений подойдет для вашего случая (возможно, timeSeries или timeSeriesProfile)? О DSG часто говорят в контексте данных наблюдений, но они также должны применяться к выходным данным модели с выборкой.

0 голосов
/ 16 января 2019

Любой N-мерный разреженный массив может быть представлен в виде списка (или одномерного массива) кортежей, где каждый кортеж имеет N координатных значений и одно значение данных.

Если массив достаточно разрежен, представление на основе списка занимает меньше места ... на диске и в памяти.

Теперь простое представление на основе списка НЕ ​​подходит для произвольного доступа, потому что вам нужно сканировать список, чтобы получить доступ к значению в любой точке исходного массива. Вы можете улучшить это (в версии в памяти):

  • Если вы упорядочиваете список на основе координат и используете ArrayList, вы можете выполнить двоичный поиск, чтобы найти значение для набора координат. Это дает индексирование O(log N) без дополнительных затрат памяти.

  • Если вы используете HashMap<Coords, Value>, вы можете получить O(1) lookup. Тем не менее, это связано со значительными дополнительными затратами памяти. Возможно, от 50 до 80 дополнительных байтов на запись по сравнению с использованием представления ArrayList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...