haskell / haskell/binary

get for UArray blows the heap for large arrays

Ouverte
#34 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Haskell
Étoiles
120
Forks
70
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

``` haskell
instance (Binary i, Ix i, Binary e, IArray UArray e) => Binary (UArray i e) where
get = do
bs <- get
n <- get
xs <- getMany n
return (listArray bs xs)
```

getMany is fully strict in the list, since it uses an accumulator and reverses it at the end. The intermediate xs list can be huge in cases where the eventual UArray is much more manageable (eg 28M Booleans).

Two questions:

1) Is there a known alternative for (un)serializing UArrays to(from) disk? Such an alternative would make this Issue far less important.

2) Have you considered a version that serializes the bytes directly? I drafted one up; it's tremendously more efficient, though I'm concerned about robustness wrt endianness etc. Furthermore, it requires a base monad that can mutate arrays, which requires an "unsafe" invocation. And lastly it's not portable, using ghc-prim.

HTH. Thanks.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez par l’instance get de Binary (UArray i e) et son chemin getMany, en reproduisant le décodage d’un grand Boolean UArray afin de mesurer l’utilisation mémoire de la liste intermédiaire. Examinez l’approche direct-byte proposée au regard de l’endianness, de la mutabilité, de la portabilité de ghc-prim et des alternatives de sérialisation sur disque. La tâche est considérée comme terminée lorsqu’un périmètre convenu et un chemin de sérialisation UArray testé évitant l’explosion du heap ont été définis.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
haskell
Domaine
data
Type d'issue
Bug
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.