Эффективная обработка редко пропущенных данных в Haskell

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

Проблема в том, что данные содержат некоторые пропущенные значения. Я не хочу кодировать их как «99» или что-то подобное, потому что это просто уродливый взлом и потенциальный источник ошибок. С точки зрения новичка в Haskell, я могу думать о следующих вариантах:

  1. Упакованный вектор распакованных значений Maybe . Что-то вроде (исправьте, если ошиблись):
    data myMaybe a = Nothing | Просто {- # UNPACK # -}! A
  2. Распакованный вектор (неупаковываемых) кортежей с логическим элементом, указывающим на отсутствие:
    экземпляр newtype Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data. Vector.Unboxed.Vector (Bool, a))
    Это может быть тот же подход, который выбран OP этого вопроса (по модулю Int для Bool ]), но единственный ответ, похоже, явно не решает проблему отсутствующих значений / разреженности (вместо этого фокусируется на том, как представить весь массив без упаковки, а не как упакованный вектор из распакованных векторов).
  3. Кортеж из распакованных векторов, один со значениями, другой с индексами, в которые должны быть введены отсутствующие значения, или длинами серий непропущенных значений, или некоторой эквивалентной информацией. Это может быть предпочтительнее, чем вариант 2. Если пропуски редки?

Я пытаюсь придерживаться векторного представления, а не чего-то вроде этого , потому что это пропущенные значения , которые редки, а не данные .

Любые комментарии относительно относительных достоинств / осуществимости / готовой доступности / вероятной производительности этих опций или даже указатели на совершенно другие альтернативы приветствуются!

Изменить:

  • Было указано, что ответ потенциально зависит от того, какие операции я собираюсь выполнять с данными. На данный момент кажется более удобным хранить каждое наблюдение в одном векторе, а не каждую переменную. Так как записи в векторе будут относиться к разным переменным, операции типа «сворачивания» маловероятны.
  • Я предполагаю, что 2. будет внутренне сохранять "действительный битовый" вектор а-ля 3. автоматически, если необходимо, поэтому 3. может быть удален?

11
задан Community 23 May 2017 в 12:29
поделиться