Приведение mmapped ByteString к другим типам? - PullRequest
2 голосов
/ 21 сентября 2009

Я понимаю, что это может быть довольно еретическим вопросом, но мне интересно, могу ли я отобразить файл данных через System.IO.Posix.MMap, а затем cast результирующий ByteString в строгий массив некоторого другого типа ? Например. если я знаю, что файл содержит double, могу ли я каким-то образом перенести эти mmapped-данные в UArr Double, чтобы я мог делать на нем sumU и т. д., а система виртуальной памяти позаботилась о IO? По сути, это то, как я имею дело с наборами данных размером в несколько ГБ в моем коде C ++. Альтернативные более идиоматические способы сделать это также приветствуются, спасибо!

Максимальные дополнительные баллы за то, как я могу также выполнять многоядерную обработку данных :-) Не то, чтобы я требовал или что-то в этом роде.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2009

Я не думаю, что это безопасно. UArr - это куча Haskell, выделенная не закрепленной памятью, GC переместит ее. ByteStrings (и mmapped) являются ForeignPtrs для закрепленной памяти. Это разные объекты в среде выполнения.

Вам нужно будет скопировать, чтобы это было безопасно, если вы меняете базовый тип с ForeignPtr на значение Haskell 'a'.

1 голос
/ 21 сентября 2009

Боюсь, я не знаю, как разыграть ByteString до UArr T, но я хотел бы потребовать некоторые «дополнительные очки», предлагая вам взглянуть на Data Parallel Haskell ; от проблемы, которую вы описали, это может быть прямо на вашей улице.

0 голосов
/ 23 сентября 2009

Вы, вероятно, хотите здесь Foreign.Marshal, и особенно Foreign.Marshal.Array . Он был разработан, чтобы сделать именно это.

...