2009-09-21 3 views
2

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

Высшие дополнительные баллы за пути Я также могу обрабатывать многоядерные данные :-) Не то, чтобы я требовал или что-то еще.

ответ

3

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

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

+0

Thanks; Я боялся, что так будет. Мне никогда не удавалось манипулировать большими наборами данных, когда они должны быть загружены в пространство GC'd любого языка. Мой нынешний подход только к mmap'у обычно работает нормально. Позволит копировать несколько сокращенных наборов данных и посмотреть, как все работает. – billt

1

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

+0

Да, DPH и другие блестящие игрушки Haskell действительно привлекательны. Как только я получу больше внимания на языке, я хочу попробовать его по некоторым из моих более крупных проблем (наборы данных в 10 с минимального диапазона GB). – billt

0

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

Смежные вопросы