2011-06-16 11 views
6

Necesito una forma de almacenar grandes fragmentos de datos (~ 1-2MB) a una velocidad alta (~ 200-300Mbit/s).
Después de algunas investigaciones me encontré con varias opciones:¿Cuál es la manera más rápida de escribir datos secuenciales en un disco bajo Mac OS X?

  • aio_write
  • Direct_IO
  • carbono del Administrador de archivos PBWriteForkAsync()
  • predeterminado fwrite(), envuelto en un bloque y se envían a través de GCD
  • NSData de appendData en un NSOperation
  • ...

Este wiki page describe el estado de aio_write bajo Linux. Lo que no encontré fue una página similar sobre el estado de aio_write para Mac OS X.

NSOperation o Blocks + GCD parece ser una técnica para lograr IO sin bloqueo. Se utiliza en varias bibliotecas IO de código abierto (por ejemplo, https://github.com/mikeash/MAAsyncIO)

¿Alguien con un problema similar encontró una solución adecuada?
Actualmente tiendo a PBWriteForkAsync ya que toma algunos parámetros de 'ajuste'. También debe ser seguro a 64 bits.

+0

No hay forma de distinguirlo de los puntos de referencia. También podría considerar mmap(). – wnoise

+0

Definitivamente voy a medir. Actualmente estoy buscando todas las opciones disponibles. –

+2

bajo osx aio_write no es una muy buena opción ya que no hay forma de recibir notificaciones que no sea por señal. e incluso entonces, no obtiene datos de usuario asociados porque eso no es compatible con osx. Sugeriría descartar aio_write de la lista. –

Respuesta

2

No sé MacOS muy bien, pero también me gustaría probar open y write llamadas al sistema de unistd.h con la opción de no bloqueo O_NONBLOCK. reference

+0

Gracias. No sabía O_NONBLOCK. Conocía O_DIRECT (que no está disponible en OS X). Actualmente uso un enfoque personalizado que usa mmap y Grand Central Dispatch y se ve bien hasta ahora.Al usar GCD, mi IO también es no bloqueante y mmap me obliga a hacer escrituras rápidas y alineadas con la página. –

1

Debe utilizar sin búfer de E/S para las escrituras, en Carbon esto es FSWriteFork() con kFSNoCacheBit, en uso BSD fcntl() con F_NOCACHE.

En lugar de utilizar el IO no bloqueante del sistema, es posible que desee considerar un hilo de trabajo para escribir los bloques secuencialmente utilizando una cola. Esto le dará más control y puede terminar siendo más simple, particularmente si desea monitorear la cola para ver si se está manteniendo o no.

Consulte here para obtener más información.

+0

Gracias. Ya experimenté con PBWriteForkAsync como se menciona en el documento de Apple que vinculó. Sorprendentemente, eso fue más lento que FSWriteFork. Eventualmente terminé usando 2 regiones mmap-ped secuenciales. Escribo en una región hasta que esté llena. Luego cambio, amplío y vuelvo a mapear el archivo en un hilo de fondo GCD (protegido con un semáforo). –

Cuestiones relacionadas