2013-06-25 8 views
11

Betrachten Sie den folgenden Code ein: http://hpaste.org/90394Segfault Lesen faul bytestring letzten 2^18 Byte

Ich bin Speicher eine große 460 MB-Datei zu einem faulen ByteString zuordnen. Die Länge der ByteString-Berichte lautet 471053056.

Wenn zu einer niedrigeren Knoten-ID geändert wird, dh: 10000, funktioniert es einwandfrei. Jedoch; sobald ich versuche, etwas zu serialisieren, das genau 2^18 Bytes (262144) vom ByteString hinter mir liegt, bekomme ich Segmentation fault/access violation in generated code und die Beendigung.

Ich verwende Windows und verwende GHC 7.4.2.

Bitte geben Sie an, ob dies meine Schuld ist, oder ein Problem mit der Faulheit, oder ein Problem mit Haskell.

+1

Ihr 'getNXNode' stimmt nicht mit der' NXNode' -Datendefinition überein. Wenn das beabsichtigt ist, wäre es einen Kommentar wert. Aber ich sehe nicht, wie das hier einen Segfault verursachen würde. –

+0

@DanielFischer 'NXNode 0 <$> ...' :) – kvanberendonck

+0

Ja, aber Sie "überspringen" 20 Bytes und lesen nur 12 pro Knoten. –

Antwort

1

Beachten Sie, dass ich mmap aktualisiert habe, um das NOINLINE-Pragma am strategischen Punkt im Code korrekt zu integrieren. mmap-0.5.9 verfügbar für Greifer. Lassen Sie mich wissen, ob das Problem weiterhin besteht. Edit: Ja, ich bin der Autor von mmap.

+0

Während es scheint, dass Sie der MMAP-Autor sind, ist dies nicht ganz klar aus Ihrer Antwort. Ich würde in Betracht ziehen, weitere Informationen hinzuzufügen. – Syon