OVH Cloud OVH Cloud

Création de fichier et thread

4 réponses
Avatar
vincent brice
Bonjour,

Voici la situation:
J'ai un démon qui tourne pour récupérer des fichiers dans un répertoire
précis.
J'ai plusieurs thread qui crée le même type de fichier.
Ma question est : est-ce que lorsque l'on fait flush pour l'écriture d'un
ficher dans un répertoire, ce flush peut-il être arrêter lors du
time-slicing ? Le problème est que si le flush est arrêté, un fichier est
quand même créé (sans être fini) et mon démon le prend tel quel.... bonjour
les problèmes sachant qu'il peut y avoir beaucoup de thread...

Sinon y a t-il une solution ?

Merci à l'avance.

4 réponses

Avatar
Jacques-Olivier Haenni
Bonjour,

En fait, le fichier est déjà créé AVANT le flush. Le flush assure
uniquement que toutes les données qui ont été écrites le sont
effectivement dans le fichier (i.e. les buffer sont vidés).
Il ne s'agit pas d'un commit. Avec les filesystems habituels, il n'est
pas possible de créer et de remplir un fichier de manière atomique.

Pour résoudre ton problème, tu peux:
- utiliser une base de données (on peut y insérer des données de manière
atomique)
- ou créer et remplir ton fichier dans un autre répertoire, puis le
déplacer dans le répertoire précis; pour autant que les deux répertoires
sont sur la même partition, le déplacement peut être considéré comme
atomique.

Jacques-Olivier

vincent brice wrote:

Bonjour,

Voici la situation:
J'ai un démon qui tourne pour récupérer des fichiers dans un répertoire
précis.
J'ai plusieurs thread qui crée le même type de fichier.
Ma question est : est-ce que lorsque l'on fait flush pour l'écriture d'un
ficher dans un répertoire, ce flush peut-il être arrêter lors du
time-slicing ? Le problème est que si le flush est arrêté, un fichier est
quand même créé (sans être fini) et mon démon le prend tel quel.... bonjour
les problèmes sachant qu'il peut y avoir beaucoup de thread...

Sinon y a t-il une solution ?

Merci à l'avance.






Avatar
alexandre cartapanis
Je te conseille de regarder la classe java.nio.channels.FileLock.


Bonjour,

En fait, le fichier est déjà créé AVANT le flush. Le flush assure
uniquement que toutes les données qui ont été écrites le sont
effectivement dans le fichier (i.e. les buffer sont vidés).
Il ne s'agit pas d'un commit. Avec les filesystems habituels, il n'est
pas possible de créer et de remplir un fichier de manière atomique.

Pour résoudre ton problème, tu peux:
- utiliser une base de données (on peut y insérer des données de manière
atomique)
- ou créer et remplir ton fichier dans un autre répertoire, puis le
déplacer dans le répertoire précis; pour autant que les deux répertoires
sont sur la même partition, le déplacement peut être considéré comme
atomique.

Jacques-Olivier

vincent brice wrote:

Bonjour,

Voici la situation:
J'ai un démon qui tourne pour récupérer des fichiers dans un répertoire
précis.
J'ai plusieurs thread qui crée le même type de fichier.
Ma question est : est-ce que lorsque l'on fait flush pour l'écriture
d'un
ficher dans un répertoire, ce flush peut-il être arrêter lors du
time-slicing ? Le problème est que si le flush est arrêté, un fichier est
quand même créé (sans être fini) et mon démon le prend tel quel....
bonjour
les problèmes sachant qu'il peut y avoir beaucoup de thread...

Sinon y a t-il une solution ?

Merci à l'avance.








Avatar
Patrick Gras
Hello,

Une technique assez simple est de renommer (typiquement changer l'extension)
le fichier une fois qu'il est 'complet'.

Comme ça le démon ne va le voir qu'à ce momment là...

-Patrick



"Jacques-Olivier Haenni" wrote in message
news:d9g7s9$9t0$
Bonjour,

En fait, le fichier est déjà créé AVANT le flush. Le flush assure
uniquement que toutes les données qui ont été écrites le sont
effectivement dans le fichier (i.e. les buffer sont vidés).
Il ne s'agit pas d'un commit. Avec les filesystems habituels, il n'est
pas possible de créer et de remplir un fichier de manière atomique.

Pour résoudre ton problème, tu peux:
- utiliser une base de données (on peut y insérer des données de manière
atomique)
- ou créer et remplir ton fichier dans un autre répertoire, puis le
déplacer dans le répertoire précis; pour autant que les deux répertoires
sont sur la même partition, le déplacement peut être considéré comme
atomique.

Jacques-Olivier

vincent brice wrote:

Bonjour,

Voici la situation:
J'ai un démon qui tourne pour récupérer des fichiers dans un répertoire
précis.
J'ai plusieurs thread qui crée le même type de fichier.
Ma question est : est-ce que lorsque l'on fait flush pour l'écriture
d'un


ficher dans un répertoire, ce flush peut-il être arrêter lors du
time-slicing ? Le problème est que si le flush est arrêté, un fichier est
quand même créé (sans être fini) et mon démon le prend tel quel....
bonjour


les problèmes sachant qu'il peut y avoir beaucoup de thread...

Sinon y a t-il une solution ?

Merci à l'avance.








Avatar
Kermabon Stéphane
Passer par deux répertoire, un premier ou tu écris le fichier, et une
fois l'écriture terminé tu le déplace dans le second qui lui est scruté
par tes démons. Ainsi seul les fichiers complets sont considérés. Est-ce
que c'est satisfaisant?

Démis


Bonjour,

Voici la situation:
J'ai un démon qui tourne pour récupérer des fichiers dans un répertoire
précis.
J'ai plusieurs thread qui crée le même type de fichier.
Ma question est : est-ce que lorsque l'on fait flush pour l'écriture d'un
ficher dans un répertoire, ce flush peut-il être arrêter lors du
time-slicing ? Le problème est que si le flush est arrêté, un fichier est
quand même créé (sans être fini) et mon démon le prend tel quel.... bonjour
les problèmes sachant qu'il peut y avoir beaucoup de thread...

Sinon y a t-il une solution ?

Merci à l'avance.