Bonjour,

J'aurais aimé avoir quelques avis. Est il possible de transférer les données d'un appareil sans passer par la mémoire Windows, c'est à dire sans faire une allocation mémoire classique !? En gros, créer un flux de données qui parte de la carte d'acquisition et qui aille directement dans le disque dur en by-passant la ram de l'OS... càd faire du streaming. En fait, je voudrais juste faire une allocation mémoire disque dur pour que ça parte directement dans le disque...au lieu de faire une allocation mémoire "windows"...

Je m'explique...je récupère via une carte d'acquisition un signal qui se répète 4000 fois par seconde (4KHz), je récupère les 10 000 premiers points sur ses 80 000 points de période qu'il contient, avec une fréquence d'échantillonnage de 300 millions d'échantillons par seconde, acquisitions que j'aimerais enregistré sur un disque dur externe (reliée en PCI express) en temps réel, dans des fichiers binaires...ou autres du moment que je puisse les relire et qu'ils prennent le moins de place possible...

Pour ça, j'alloue de la mémoire de la façon suivante en fonction de la taille de mes données (méthode qui a priori n'est pas bonne) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// Alloue de la mémoire
waveformPtr_session1 = (void*) malloc (LengthDataType * actualRecordLength_session1 * numWaveform_session1);
et je récupère les données dans la mémoire de la carte via une fonction spécifique du driver de l'appareil

Code : Sélectionner tout - Visualiser dans une fenêtre à part
niScope_FetchBinary8 (sessions[0], channelListSession1, timeout, actualRecordLength_session1, (ViInt8*) waveformPtr_session1, wfmInfoPtr_session1);
Tout se passe dans le pointeur waveformPtr_session1, je lui alloue une quantité de mémoire dans windows comme on peut le voir dans le code au dessus et ensuite je récupère avec ce pointeur les données (1 échantillon = 1 octet donc 10 Ko de données par itération) via la fonction fetch qui est dans une boucle (10 000 pts à chaque itération). En gros, je récupère les données, j'enregistre dans le fichier et je boucle jusqu'au stop. Pour gérer tout ça, j'ai créé deux threads, un pour l'acquisition et un pour l'écriture dans le fichier que je gère avec des sémaphores et un mutex.

C'est trop lent, je perds des données, je passe par la mémoire Windows au lieu d'écrire directement dans le disk externe relié en PCI express. Même quand je supprime la partie écriture dans le fichier, ça perd des données. Je ne respecte pas le principe du streaming développé dans ce lien, ça doit être la cause de mon problème :

https://www.ni.com/fr-fr/innovations...from-disk.html

Implementing streaming from the instrument, through the controller, and onto hard disk increases the available memory of the instrument from megabytes to terabytes. By utilizing the high-bandwidth PXI and PXIe bus architectures, data can stream to and from hard disk at a rate high enough to support the instrumentation. This means that oscilloscopes can acquire data and store it directly to disk, while arbitrary waveform generators can pull data directly from disk, bypassing the previously-limiting onboard memory.
Il faut donc que je trouve une solution pour remplacer

Code : Sélectionner tout - Visualiser dans une fenêtre à part
waveformPtr_session1 = (void*) malloc (LengthDataType * actualRecordLength_session1 * numWaveform_session1);
par quelquechose qui enverrait directement les données dans le disque dur externe de 10To...ce qui serait équivalent à passer à une carte de 1Go de RAM (qui se remplie en quelques secondes) à 10To de RAM, soit plusieurs heures d'enregistrements...

J'ai fait quelques recherches qui m'ont dirigées vers le FileMapping, la mémoire virtuelle, etc... encore flou pour moi pour le moment,...la bonne piste selon vous !? J'hésite à m'engager sur ces pistes...

Si des personnes savent écrire les données d'un appareil dans un disque dur sans passer par la mémoire Windows ou qui savent faire du streaming en C, je suis preneur de pistes . Aucun des exemples que j'ai ne traite du streaming et pas grand chose, voir rien en C dans mes recherches et le constructeur des cartes d'acquisition ne donne pas d'info pour le faire en C, en gros, il faut passer à la caisse et acheter leur solution, leur logiciel américain LABview en langage G, mais ça doit se faire en C !

Désolé si je ne suis pas clair mais fin de journée + casse tête , je ne suis plus très frais en écrivant ce post...!

PS : je suis sous visual C 2008

Bonne semaine à tout le monde.