Devenir membre club
Connectez vous
Aide & règlement
Votre 1ère visite
Le règlement
Contacter les admins
Contacter le webmaster
Questions & réponses
Comment soutenir CodeS-SourceS
Comment faire un lien vers CodeS-SourceS
Autres questions
A propos & don
A propos du réseau
Les modérateurs
Remerciements
Faire un don
Le livre d'or
Tous les livres
Les dernières parutions
Les plus consultés
Les critiques
Le top des ventes
Le top favoris des membres
Recevoir des livres blancs
Tous les thèmes
Les derniers messages
Les nouveaux messages
Poser une question
Le Chat - IRC
Tous les tutoriels
Ajouter un tutoriel
Les tutoriels en vidéo
Les formations vidéos
Tous les codes
Ajouter un code
Filtrer par catégorie
Filtrer par date
Les plus récents
Les mis à jour
Les codes par jour
Filtrer par niveau
Niveau débutant
Niveau initié
Niveau expert
Filtrer par type
Les codes avec capture
Les codes avec zip
Les codes .Net
Filtrer par qualité
Les plus populaires
Les plus populaires du mois
Les plus téléchargés
Les mieux notés
Top par catégorie
Top des favoris
Filtrer par auteur
Tous les auteurs
Le top des membres
Les snippets
Déposer votre CV
Consulter les offres d'emploi ou de stage
Consulter les CVs
Déposer une offre d'emploi ou de stage
Modèles de CV et lettres
Trouver une convention collective
Les écoles d'informatique
Toutes les écoles
Ajouter une école
Les outils
Outils pour développeurs
Trouver des ressources
Base de données de CodeS-SourceS
Télécharger les meilleurs logiciels
Comparer les prix
Envoyer des ecards
Création de bannières
Annuaire de la prog
Tous les sites
Ajouter votre site
Le dico de la prog
Toutes les définitions
Ajouter une définition
Les évènements
Tous les évènements
Les évènements à venir
Ajouter un évènement
Téléchargements
CodeS-SourceS Toolbox
CodeS-SourceS Toolbar
Toolbar pour FireFox
Fonds d'écran
Les compil's
Nos partenaires
Magazine Programmez
Frontier.fr
Xiti
ProgOnline
Winwise
Editions Eyrolles
Toute la liste
Les RFC
CS
VB, VB.NET
ASP.NET,ASP
C, C++
ColdFusion
PHP
Javascript
Delphi
Flash
Java
Graphisme
Irc
Assembleur
C#
Mobilité
SQL
Foxpro
Python
Regex
Flex
Windev
Ce site au démarrage
begin process at 2012 02 11 03:07:15
Accueil
Codes
Tutoriels
Forum
Livres
Emploi
Services
Connexion
Trouver un code source :
dans
Tout le site
Codes
Tutoriels
Forum
Blogs
Livres
RFC
Icones
News .NET
Boutique
[ Dernières recherches ]
Veuillez saisir votre recherche... Ex: smtp, lire un fichier, rs232
Options de recherche :
Tous les codes
Tous les codes en .Net
Tous les codes sauf .Net
Langages disponibles :
Tous les langages
ASP / ASP.NET
Assembleur
C / C++ / C++.NET
C# / C#.NET
ColdFusion
Delphi
Flash
Flex, Air, ActionScript
Foxpro
Graphisme
IRC
JAVA / J2EE
Javascript / Ajax / DHTML
PDA / PocketPC
PHP
Python
Regex, Regular Expression, Expression régulière
SQL
Visual Basic, VB6, VB.NET, VB 2005, VB
61 commentaire(s) de Malkuth
sur des sources sur tout
CodeS-SourceS
Déposé sur
Outlook resiliency cleaner
Quelques petits trucs :
au lieu de faire une fonction :
public string[] LireFichier(string parametre)
une fonction :
public bool EssaiLireFichier(string parametre,out string valeur)
serait plus propre.
le paramêtre out permet de créer un paramêtre de sortie, lu'tilisation de la fonction devient plus simple :
string valeurdemonparam;
string monparam = "MonParam";
if(EssaiLireFichier(monparam, out valeurdemonparam))
{
//ici valeurdemonparam correctement récupéré
Debug.WriteLine(string.Format("[{0}] vaut [{1}]", monparam, valeurdemonparam));
}
else
{
//ici valeurdemonparam non récupéré
Debug.WriteLine(string.Format("Impossible de lire [{0}]", monparam));
}
pour codé une telle fonction voilà le principe :
public bool EssaiLireFichier(string parametre,out string valeur)
{
//ici quand on as pus lire
valeur = valeurlu;
return true;
//ici quand on as pas pus lire
valeur = string.Empty;
return false;
}
Ensuite, à propos de la "fausse constante" :
string RCNL = Environment.NewLine;
tu peux écrire :
string readonly RCNL = Environment.NewLine;
ca empecheras toute modification ultérieur de la valeur qui devient une pseudo constante.
Attention toutefois :
truc readonly trucconstant = new truc();
empêchera de faire
trucconstant = new truc();
mais pas
trucconstant.machin = new machin();
Posté le :
23/10/2009 21:28:03
Déposé sur
"surface like" en silverlight
Il n'a actuellement aucun commentaire, je considère cette source comme non terminer tant que je n'aurais pas réussi à régler le problème de TemplateBinding, si vous avez idée de se qui pose problème, n'hésité pas à m'en faire part!
Il y'as 2 projet, Malkuth.Controls qui contient les contrôles Surface et SurfaceItem, l'autre projet est une petite application pour montrer l'utilisation et la facilité a intégré des éléments très divers dans les SurfaceItem.
Posté le :
31/03/2009 11:39:46
Déposé sur
Split sql sans table temporaire
Voilà un exemple complet avec implémantation du IDatareader :
http://www.csharpfr.com/codes/BULKINSERT-CSHARP_49377.aspx
Posté le :
27/02/2009 20:00:17
Déposé sur
Split sql sans table temporaire
Le cross aplly est effectivement trés pratique mais je doute vraiment que les performances soient au rendez vous.
sur 10 000 000 de lignes traitée la charge de travail deviens vraiment colosale et je crois que chaque partie d'un produit doit être utilisé pour ce qu'il sait le mieux faire, et pour moi C# est bien plus performant en transformation linéaire de donnée que SQL Serveur.
Sle projet avais été pure SQL pourquoi pas (enfin je pense que TheOnlyMaX à une solution plus performante) mais étant donnée qu'il nous présente un code C# j'en conclu qu'il a donc du C# dans son projet donc autant l'utiliser là ou il est mieux indiquer...
@TheOnlyMaX : serait'il possible que tu me passe un de tes fichiers d'importation type? (un Fake bien entendu) avec la table dans laquelle les données sont placé au final(déclaration SQL) afin de consolidé mon code pour un cas réaliste? pour infos je suis à un temps de 11 sec de traitement pour lecture/néttoyage/vérification métier sur un fichier de 10 000 000 de ligne et 3 colones (reste a traiter le bulkinsert en lui même) et ce code est trés loin d'un code optimisé.
Posté le :
27/02/2009 16:59:28
Déposé sur
Split sql sans table temporaire
Alors en fait, si tu baisse la valeur, c'est aussi baisser l'intêret du bulkcopy (aprés on peu tester différentes valeurs et en trouver une correct dans ton cas de maniére empirique).
Ensuite, ce code peux êtres déployé sur une autre serveur donc on déplace le probléme de charge mémoire/Travaille vers une machine qui n'auras pas la même importance dans le process glabal (voir dédier).
enfin, comme je le disait dans le dernier commentaire la fonction de transfert au serveur accept les interface IDatareader, celle ci représente un flux de lecture de donnée en avant uniquement, elle n'as donc pas besion de "Buffériser" les données, en gros pour expilquer l'interface:
une fonction ReadNext qui avannce d'une ligne le flux.
des fonction GetInt32(int col)/GetString(int col)/... qui lise la donnée de la [col] dans la ligne courante.
plusieur fonctions qui permette de gérés les métadonnée(nom de colone,type des colones etc.
En utilisant les fonction précédante et en les encapsulant dans une classe implémantant cette interface, on peu arrivé a ne jamais avoir plus d'une ligne de donné en mémoire.
Attention, en disant cela jetiens a présisé que je ne connait pas le fonctionnement interne de l'objet SqlBulkCopy, a t'il un buffer interne? a voir... un point important aussi, il faut bien pensé paramettré le Timeout car si l'opération est longue celui ci est vite dépassé et mettre une valeur trop longue peux complétement bugé le tout.
Enfin l'objet SqlBulkCopy posséde plusieur constructeur simpathique dont notement un constructeur permetant de spécifier une transaction et les option de Bulk (déclanchement des triggers,gestion des NULL/AutoIncrément etc, ce qui le rend particuliérement complet.
Un dernier point intérréssant de cette technique est sa souplesse il est trés facile d'introduire plusieurs couches de travaille intermédiare et de faire un code trés modulaire. ex :
Ajout d'un process de validation Métier:
public IEnumerable<donnéestructurées> ValidationMetier IEnumerable<donnéestructurées> donnéesavérifier)
{
foreach (donnéestructurées lignepropre in donnéesavérifier)
{
if (lignepropre.col_age < 10
|| lignepropre.col_age > 20
|| string.IsNullOrEmpty(lignepropre.col_nom))
// si ca va pas on reprend le traitement a la ligne suivante
continue;
//Si tout va bien on envoie la ligne propre et on continue ;)
yield return lignepropre;
}
}
Ce qui permet maintenant de faire :
Insererligne(ValidationMetier(nettoyerlignes(lireLignes("monfic.csv"))));
Maintenant, admettons que le fichier de départ est maintenant un XML :
public IEnumerable<donnéestructurées> LireDonnéesXML(string fichierxml)
{
....
yield return ...;
....
}
On peut mtn faire :
Insererligne(ValidationMetier(LireDonnéesXML("monfic.xml")))
La ca devient trés simpa car on a pu reprendre facilement le code commun sans ce prendre la tête et en gardant une compatibilité avec l'ancien code qui peut toujours servir si les deux type de fichier sont utilisé...
Enfin cette maniére de faire permet trés facilemet de test chaque fonction hors context et de valider son process:
public IEnumerable<string> fauxlecteur()
{
yield return "Tom;10;";
yield return "Rom;20";
yield return "Tiemh";
}
public void VérificationNetoyage(IEnumerable<donnéestructurées> données)
{
IEnumerator<donnéestructurées> enum = données.GetEnumerator();
if(!enum.MoveNext()) throw new Exception();
if(enum.Current.col_nom!= "Tom") throw new Exception();
if(enum.Current.col_age!= 10) throw new Exception();
if(!enum.MoveNext()) throw new Exception();
if(enum.Current.col_nom!= "Rom") throw new Exception();
if(enum.Current.col_age!= 20) throw new Exception();
if(enum.MoveNext()) throw new Exception();
}
maintenant si on fais : VérificationNetoyage(nettoyerlignes(fauxlecteur())); et qu'on obtient une exception alors le nétoyage ne fonctionne pas comme on l'attendrais!
Vu que ca à l'air de plaire, je vais trouvé un peux de temps se weekend pour faire une source d'exemple complette.
Posté le :
27/02/2009 12:51:00
Déposé sur
Split sql sans table temporaire
en fait on remarque que le WriteToServeur peut aussi utilisé une interface IDataReader en paramêtre, donc pour allez un peu plus loin le mieux serais d'encapsuler les 2 fonctions dans une classe implémentant IDataReader ce qui évite de se retrouver a gérer un buffer en DataTable (j'ai horreur de ces objets DataRow/DataTable etc...) et la on aurais vraiment un programm entiérement "A la Volé" mais bon cette interface est un peu longue a implémenter pour un commentaire...peut être un code prochain.
Posté le :
27/02/2009 09:04:15
Déposé sur
Split sql sans table temporaire
oups, aprés la boucle foreach dans Insererligne il manque :
if((nblignes%100000)!=0)
cpy.WriteToServer(donnéespretes);
Posté le :
26/02/2009 22:22:29
Déposé sur
Split sql sans table temporaire
Lecture/ nétoyage à la volé ca veut dire en gros tu lis une ligne du fichier, tu la notoie aussitôt et tu la transmet au serveur.
donc, lire une à une les ligne d'un fichier texte ca donne un truc du genre :
public IEnumerable<string> lireLignes(string cheminfichier)
{
string ligne;
using (TextReader txtstrm = File.OpenText(cheminfichier))
while ((ligne = txtstrm.ReadLine()) != null)
yield return ligne;
}
ensuite on doit les néttoyé on va séparé ca en 2 phases : l'extraction des données puis leur vérification pour des d'optimisation certain les 2 étape peuvent être plus ou moins mélé, au passage on crée une petite structure légére pour conservé les donnée nétoyé (et typé d'ailleurs...)
public struct donnéestructurées
{
public string col_nom;
public int col_age;
}
public IEnumerable<donnéestructurées> nettoyerlignes(IEnumerable<string> lignesbrute)
{
foreach (string ligne in lignesbrute)
{
donnéestructurées lignepropre = new donnéestructurées();
//extraction des données
string[] donnesintermediaire = ligne.Split(';');
if (donnesintermediaire.Length != 2) continue;// si ca va pas on reprend le traitement a la ligne suivante
lignepropre.col_nom = donnesintermediaire[0];
int.TryParse(donnesintermediaire[1],out lignepropre.col_age);
//Vérification de la bonne conformitée des données
if (lignepropre.col_age < 10
|| lignepropre.col_age > 20
|| string.IsNullOrEmpty(lignepropre.col_nom))
// si ca va pas on reprend le traitement a la ligne suivante
continue;
//Si tout va bien on envoie la ligne propre et on continue ;)
yield return lignepropre;
}
}
maintenant, on a donc moyen des récupéré des donnée propres juste en faisant:
nettoyerlignes(lireLignes("monfic.csv"));
(je ne sais pas ta connaissance éxacte de C# mais si tu fais une exécution pas à pas de ce code tu véras que contrairement au aparance, il lit une ligne, la nétoi, lit la suivante, la nétoi etc, si ce mécanisme t'est inconnue renseigne toi sur le mot clef yield, si connais déjà tout ca, oublie mon commentaire ;) )
alors maintenant on as des donnée propre, il faut les envoyés au serveur, solution un, une suite d'insert, a oublier dans ton cas on est bien d'accord, Solution 2, envoyé les donnée sous forme XML trés bien pour un volume moyen mais pas assez rapide pour 10millions de lignes ^^ solution 3 le Bulk insert (ouai on est d'accord ^^) et pour le bulkinsert y'a une classe pas mal foutu en .NET : System.Data.SqlClient.SqlBulkCopy
ca permet d'accéder a la plupart des fonctionnalité de Bulkinsert directement depuis le code(donc sans avoir besiion de réécrire les données dans un fichier.
voici un exemple
public void Insererligne(IEnumerable<donnéestructurées> données)
{
using(SqlConnection con = new SqlConnection("maconnexion"))
{
using (SqlBulkCopy cpy = new SqlBulkCopy(con))
{
cpy.BulkCopyTimeout = 100000;
cpy.BatchSize = 100000;
cpy.DestinationTableName = "matablefinal";
cpy.ColumnMappings.Add("col_nom", "Nom");
cpy.ColumnMappings.Add("col_age", "Age");
DataTable donnéespretes = new DataTable();
DataColumn cNom = new DataColumn("col_nom", typeof(string));
donnéespretes.Columns.Add(cNom);
DataColumn cAge = new DataColumn("col_age", typeof(int));
donnéespretes.Columns.Add(cAge);
int nblignes = 0;
foreach (donnéestructurées donné in données)
{
DataRow row = donnéespretes.NewRow();
row[cNom] = donné.col_nom;
row[cAge] = donné.col_nom;
donnéespretes.Rows.Add(row);
if((nblignes%100000)==0)
cpy.WriteToServer(donnéespretes);
}
}
}
}
donc maintenant tu fais : Insererligne(nettoyerlignes(lireLignes("monfic.csv")));
et ca roule.
Le code es pas optimiser pour 2 sous mais même en l'état il doit être bien plus performant.
Posté le :
26/02/2009 22:18:48
Déposé sur
Split sql sans table temporaire
Je rejoins tmcuh, je pense que la método n'est pas optimal(mais on as pas forcerment toute les infos...)
a lors actuel tu fais :
BulkInsert d'un CSV en table intermédiaire
Nettoyage/insertion final
Clairement SQL n'est pas le meilleur choix pour le nétoyage(qq bench pourrons facilement le prouver).
je pense que tu aurais plutot du utilisé la métho suivante :
Lecture/Nétoyage du CSV (netoyage a la volée)
bulkinsert dans la table final.
tu dispose de la classe [System.Data.SqlClient.SqlBulkCopy] qui permet de commander facilement l'insertion Bulk directement depuis C#.
D'abord ca me semble plus logique et surtout, Ca permet de déporter la charge de nettoyage sur une machine différente (voir plusieurs...)
Posté le :
26/02/2009 18:37:27
Déposé sur
Une classe pour gérez les requettes post sur serveur http [.n...
Je vais essayer de me dégager un peu de temps se weekend pour mettre un peu a jour cette source et prendre en compte tes ajout, concernant l'encodage, je ne suis convaincu ni par le UTF8 ni par le et moins encore par le default qui risque d'être génant lors d'échange avec des system reposant sur d'autre encodage (unix/linux notament), en fait je pense rajouter un propriéter encoding sur le constructeur se qui me déchargeras de toute "responsabilitée" et rendra le code plus maléable :p
je vais aussi supprimer les Encoding.GetBytes(...) qui oblige a maintenir en mémoire des tableau d'octets volumineux l'utilisation de TextWriter seras a la fois plus eficace plus simple et finalement plus compréhensible.
Posté le :
19/11/2008 07:27:30
1
2
3
4
5
6
7
Nos sponsors
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.
par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article
par Patrick Guimonet
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3
par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article
par ROMELARD Fabrice
MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !
MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !
par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article
par Vko
[FRAMEWORK 4] LES TASKS ET LE THREAD UI
[FRAMEWORK 4] LES TASKS ET LE THREAD UI
par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article
par fathi
WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE
WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE
par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article
par JeremyJeanson
La suite
RSS
Côté IT
Utiliser Office 365 pour un projet d?équipe - PART 2
Utiliser Office 365 pour un projet d?équipe - PART 1
SharePoint 2007 : Installation du Service Pack 3 de MOSS
SharePoint 2007 : Installation du Service Pack 3 de WSS V3
Installation de SQL Server DENALI CTP3
Mise à jour de Windows 2003 R2 vers Windows 2008 R2
Upgrade de SQL Server 2005 vers SQL Server 2008 R2
La suite
RSS
Offres d'emploi
Recherche Recherche développeur web ASP et ASP.Net
Recherche Analyste Programmeur Adélia
Recherche Développeur eZ Publish confirmé
Recherche AP (H/F) ACCESS EXCEL VBA
Recherche SUPPORT INFORMATIQUE / DEVELOPPEUR
Recherche Developpeur web
Recherche développeur Web
Déposer une offre
La suite
RSS
Formations Video
Coffret : Ateliers sur la mode
Atelier sur la mode : Motifs et matières
Atelier sur la mode : La planche tendance
Atelier sur la mode : De retour de pige et repérage
Corel Painter 12 : Les fondamentaux
Coffret : Microsoft Office 2010 de A à Z
De Microsoft Office 2003 à 2007 et 2010
La suite
RSS
Appels d'offres
Passerelle Pericles sur site Joomla 17
Budget :
499€
Infogerance Serveur Debian Linux
Budget :
2 400€
Developpeur applications iphone - ipad - android
Budget :
800€
La suite
RSS
Logiciels
Academy System (17.2.1.0)
ACADEMY SYSTEM (17.2.1.0)
Logiciel de gestion des établissements. - élèves/étudiants (inscription, dossier, absence...) -...
Cliquez pour télécharger Academy System
Easy-Planning (1.0.0.1)
EASY-PLANNING (1.0.0.1)
Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ...
Cliquez pour télécharger Easy-Planning
COLLECTOR PLUS (3.00B)
COLLECTOR PLUS (3.00B)
COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par : - L...
Cliquez pour télécharger COLLECTOR PLUS
PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)
PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)
PONAMEDIA TV DEVIENS HELLLOOO FLASH LA TV SUR VOTRE ORDINATEUR. Toute une plateforme Multi...
Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO
LettresFaciles 2011 (8.0.0.1)
LETTRESFACILES 2011 (8.0.0.1)
LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types. Son inte...
Cliquez pour télécharger LettresFaciles 2011
+ de logiciels à télécharger
Vidéos drôles
Halloween Party
Terry Tate Office Linebacker Superbowl 2003
Jeu vidéo instructif
C'est un véritable vol !
Banana Song
Comment attraper la grippe A
Parodie Pub Window 7
La suite
RSS
Sondage...
Votre navigateur n'utilise pas le javascript, pour
voter aux sondages de ce site, cliquez ici
Statistiques
1 873 481
membres
20
nouveaux aujourd'hui
16 151
membres club
Comparez les prix
Apple iPad 2 (16 GB) Wi-Fi White Tablet PC
Entre 639€ et 639€
Visiter le guide achat
CalendriCode
Février
2012
L
M
M
J
V
S
D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Consulter la suite du CalendriCode
Photothèque
Visiter la photothèque
CS Tool Box