2015-09-16 18 views
5

Sto utilizzando un FFI in C per inviare quantità di dati medio-grandi (~ 100 MB) a un programma C: solo un elenco di stringhe. Tuttavia, tutti i metodi che ho usato sembrano richiedere una quantità di tempo irragionevole (~ 10 sec). Dopo la creazione del profilo, sembra che l'allocazione di memoria effettiva richieda tempo. Ho provato:Problema di prestazioni di allocazione della memoria di Haskell FFI

  • invio come stringhe regolari (newCString)
  • conversione in stringhe di byte (unsafeUseAsCString)
  • conversione al vettore di caratteri (unsafeWith >>= withForeignPtr ...)

Qual è il modo più veloce per inviare dati attraverso un C FFI?

+4

Quanto sono lunghe quelle stringhe? Quanti di loro? Non sei in grado di fornire un piccolo esempio che riproduce il problema? – Bakuriu

+2

Come vengono rappresentati i dati per iniziare? –

+0

È un tipo standard con 5 campi e sto convertendo in/da stringhe per passare a un client di database in C. Ho anche provato a allocare tutto in una volta con mallocBytes e sembra che sia altrettanto lento. Un altro dato è che la profilazione di GHC indica che sono stati allocati ~ 15 GB per questo set di dati di ~ 100 MB. – ooblahman

risposta

0

Come ha detto Reid Barton nei commenti, se disponi di 100 MB di stringhe, la tua allocazione sarà terribile, a prescindere da quello che farai.

Il vostro rallentamento non è dalla FFI, dal momento che ha 100MB di stringhe per cominciare.

0

Probabilmente sarà necessario creare un tipo di dati personalizzato, utilizzando uno MutableByteArray assegnato con e trasformato in qualcosa che può essere passato a C con mutableByteArrayContents.

L'alternativa, se riesci a riscrivere l'API C con cui stai interagendo, è quella di dare alla funzione C un FunPtr che passa a una porzione di dimensioni ragionevoli dei dati Haskell con cui stai lavorando alla volta.