2011-02-02 9 views
3

Est-il possible de créer un gros fichier (physiquement) contigu sur un disque en utilisant C#? De préférence en utilisant uniquement du code managé, mais si ce n'est pas possible, une solution non gérée serait appréciée.Créer un fichier contigu en utilisant C#?

+2

Pourquoi exactement vous sentez-vous que vous avez besoin d'un fichier * contigu physiquement *? Quel problème essayez-vous de résoudre? –

+0

Je construis une sorte de base de données nosql et les performances du disque io sont une priorité. Les solutions de base de données telles que mysql, sqlserver utilisent toujours des fichiers contigus pour améliorer les performances. – tmitchel2

Répondre

3

Écrire un défragment?

On dirait que vous êtes après l'API Défragmentation de toute façon: -

http://msdn.microsoft.com/en-us/library/aa363911%28v=vs.85%29.aspx

Le lien à partir du bas, parce que ça vous semble avez manqué l'emballage C# que quelqu'un a bien voulu produit.

http://blogs.msdn.com/b/jeffrey_wall/archive/2004/09/13/229137.aspx

+0

Ouais, peut-être. Mais ne faites pas cela en C#. –

+0

Pour être honnête, bien que non géré, cette seule solution présentée jusqu'ici qui pourrait produire un fichier contigu, upvoted. – tmitchel2

0

Bref pas alors

Le système d'exploitation le fera en arrière-plan, ce que je ferais est de rendre le fichier aussi grand que vous attendez qu'il soit, de cette façon le système d'exploitation le placera contigously. Et si vous avez besoin de développer le fichier, vous le faites croître de 10% à chaque fois. Ceci est similaire à la manière dont un serveur SQL conserve les fichiers de base de données.

Ouvrez l'ouverture du FileStream et ouvrez-la avec l'ajout.

Exemple:

FileStream fwriter = new FileStream("C:\\test.txt", FileMode.Append,  FileAccess.Write, FileShare.Read); 
+0

Et cela garantira que sur le disque dur, le fichier sera écrit de manière contiguë? Je crois que non. – Oded

+0

sry, votre droite. Réponse mise à jour – EKS

+0

Votre mise à jour n'est toujours pas correcte. Le système d'exploitation n'écrit pas automatiquement les fichiers à des positions physiquement contiguës sur le disque, et ne le fait pas en arrière-plan, sauf si vous lui dites explicitement de défragmenter (et même alors, il n'y a aucune garantie sur l'endroit exact). La contiguïté physique est un obstacle important à la demande du PO. Vous manquez quelques détails sur l'implémentation de SQL Server. –

5

Tout fichier que vous créez sont logiquement contigus.

Si vous voulez physiquement contigu vous êtes sur le territoire de l'OS et du FS. Vraiment (loin) au-delà du contrôle des API d'E/S normales.

Mais ce qui se rapproche probablement est de réclamer l'espace initial: créer un flux vide et définir la propriété Longueur ou Position à ce dont vous avez besoin.

2

Avec les systèmes de fichiers modernes, il est difficile d'assurer un fichier contigu sur le disque dur. Logiquement, le fichier est toujours contigu, mais les blocs physiques qui conservent les données varient du système de fichiers au système de fichiers. Le meilleur moyen pour cela serait d'utiliser un ancien système de fichiers (ext2, FAT32, etc.) et de demander simplement un fichier volumineux en utilisant la taille de fichier désirée, puis de vider ce fichier. Des systèmes de fichiers plus récents marqueront probablement une taille de fichier importante, mais n'écriront rien sur le disque dur, mais renverront des zéros sur une future lecture sans réellement les lire.

int fileSize = 1024 * 1024 * 512; 
FileStream file = new FileStream("C:\\MyFile", FileMode.Create, FileAccess.Write); 
file.Seek(fileSize, SeekOrigin.Begin); 
file.Close(); 
+0

Considérant que la raison pour laquelle le demandeur veut faire en premier lieu est (s) il tente de mettre en œuvre une base de données, en utilisant un système de fichiers plus ne va pas travailler. FAT32 est spécifiquement limité à une taille de fichier maximale de 4 Go. Je crois que ext2 a des limites similaires (quelque part autour de 2 Go ou 4 Go), mais je n'ai aucune expérience avec ce système de fichiers, donc je ne sais pas à coup sûr. Il n'y a pas non plus de garantie que FAT32 va retourner un bloc physiquement continu non plus. –

+0

Vous avez raison à ce sujet. FAT32 est plus susceptible de le faire que Ext4, NTFS de tout autre système de fichiers en cours, et en particulier les systèmes de fichiers journalisés. Bien sûr, il n'y a aucune garantie, mais sans accéder à certains outils au niveau du système de fichiers (comme l'API Défragmentation suggéré par d'autres) c'est la meilleure suggestion que je pourrais faire .. –

1

Pour construire une base de données, vous devez utiliser les fonctions scatter-recueillir E/S fournies par l'API Windows. C'est un type spécial d'E/S de fichier qui vous permet de "disperser" les données d'un fichier en mémoire ou de "rassembler" des données de la mémoire et de les écrire dans une région contiguë d'un fichier. Alors que les tampons dans lesquels les données sont dispersées ou à partir desquelles elles sont collectées n'ont pas besoin d'être contigus, la région de fichier source ou de destination est toujours contiguë.

Cette fonctionnalité comprend deux fonctions principales, toutes deux fonctionnant de manière asynchrone. Le ReadFileScatter function lit des données contiguës à partir d'un fichier sur le disque et l'écrit dans un tableau de tampons de mémoire non contigus. Le WriteFileGather function lit des données non-contiguës à partir des tampons de mémoire et l'écrit dans un fichier contigu sur le disque. Bien sûr, vous aurez également besoin du OVERLAPPED structure utilisé par ces deux fonctions.C'est exactement ce que SQL Server utilise lorsqu'il lit et écrit dans la base de données et/ou ses fichiers journaux, et en fait cette fonctionnalité a été ajoutée à un service pack antérieur pour NT 4.0 spécifiquement pour l'utilisation de SQL Server.

Bien sûr, ce sont des choses de niveau assez avancé, et à peine pour les faibles de cœur. Étonnamment, vous pouvez réellement trouver les définitions P/Invoke sur pinvoke.net, mais j'ai une méfiance intensément sceptique du site. Puisque vous aurez besoin de passer beaucoup de temps avec la documentation juste pour comprendre comment ces fonctions fonctionnent, vous pourriez aussi bien écrire les déclarations vous-même. Et le faire à partir de C# va créer une foule de problèmes supplémentaires pour vous, de sorte que je ne le recommande même pas. Si ce type de performance E/S est important pour vous, je pense que vous utilisez le mauvais outil pour le travail.

La solution de l'homme pauvre est contig.exe, un défragmenteur à un fichier disponible en téléchargement gratuit here.

Questions connexes