Comment optimiser le temps d'écrire un fichier de lot (en enregistrant des vues de la vidéo)

StackOverflow https://stackoverflow.com/questions/8834836

  •  27-10-2019
  •  | 
  •  

Question

Arrière-plan

Je travaille actuellement sur une petite application qui saisit le RVB et carte de profondeur flux à partir d'un périphérique Kinect de Microsoft et les enregistre sur le disque pour une analyse future. Whn je lance le programme, il doit chaque trame comme une image séparée sur le disque.

Le framerate du Kinect est 30fps, mais il y a deux sources pour faire cela (environ) 60fps. Si j'essaie juste naïvement sauver chaque image quand il arrive, je perds des images comme cela est démontré par le empaqueté freenect / record.c application.

I réécrit l'application à utiliser un fil qui saisit les images de l'appareil et les pousse à l'arrière d'une double liste limitée (de std::deque). Ensuite, il y a deux fils que chaque trame pop de l'avant de la double liste terminée et enregistre les images sur le disque. Lorsque l'enregistrement est désactivé, il y a un nombre potentiellement élevé de cadres gauche dans la liste qui doivent encore être enregistrés, donc avant de quitter nous laissons les deux fils de sauvegarde font leur travail jusqu'à la fin.

Maintenant, le problème réel

Bien que le problème de la perte d'images est résolu, écrit au système de fichiers sont encore assez lent. Est-il un bon moyen d'accélérer la création de fichiers sur le disque? À l'heure actuelle, les regards fonction de dump_frame comme ceci:

static void
dump_frame(struct frame* frame)
{
    FILE* fp;
    char filename[512]; /* plenty of space! */

    sprintf(filename, "d-%f-%u.pgm", get_time, frame->timestamp);

    fp = fopen(filename, "w");
    fprintf(fp, "P5 %d %d 65535\n", frame->width, frame->height);
    fwrite(frame->data, frame->size, 1, fp);
    fclose(fp);
}

Je suis en cours d'exécution Fedora 14 x64, donc la solution suffit de problème Linux comme système d'exploitation.

Était-ce utile?

La solution

Vous devez mesurer ce qui prend du temps dans votre cas spécifique. Est-il créer plusieurs fichiers ou en train d'écrire les données d'image sur le disque?

Quand je l'ai testé sur mon système local avec OSX et un SSD Intel X25M 2G j'ai remarqué une énorme variation écrit lors de l'écriture de plusieurs fichiers 1MB vs écriture 1 fichier multi MB. Ceci est probablement dû à l'entretien ménager du système de fichiers et varie en fonction du système de fichiers que vous avez.

Pour éviter le ménage que vous pourriez place toutes vos images dans le même fichier et diviser plus tard. Cependant, les données que vous enregistrez des besoins sur les 60Mo vitesse soutenue qui est assez élevé.

Une alternative si vous avez beaucoup de mémoire est de créer un disque de RAM et stocker les images là-bas d'abord, puis les passer au système de fichiers persistant. Avec un disque de RAM 6 Go, vous pouvez stocker environ 100 secondes de vidéo.

Autres conseils

Une amélioration possible serait de définir explicitement la mise en mémoire tampon de fp à plein en utilisant setvbuf :

const size_t BUFFER_SIZE = 1024 * 16;
fp = fopen(filename, "w");
setvbuf(fp, 0, _IOFBF, BUFFER_SIZE)); /* Must be immediately after the open. */
fprintf(fp, "P5 %d %d 65535\n", frame->width, frame->height);
fwrite(frame->data, frame->size, 1, fp);
fclose(fp);

Vous pourriez profil en utilisant différentes tailles de tampons pour déterminer qui offre les meilleures performances.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top