[Résolu][C#][Linq] Récupération partielles des données

Hello les gens,

J’ai développé un petit web service qui me permet d’exporter des données vers un fichier (peu importe son format). Lors des tests sur ma machine de dév, mes données sont bien exportées vers un fichier mais semble incomplète.
Je devrais avoir 990 000 lignes dans mon fichier (un csv actuellement) or je n’ai que 164 000 lignes. Le traitement étant bien terminé puisque la méthode me renvoie une valeur de confirmation.

Alors, je me décide d’héberger le web service sur un serveur. J’appelle ma méthode d’export via une page web, et là, chose incompréhensible, mon fichier a bien ces 990 000 lignes.
Pour effectuer cet export, je me suis basé sur du Linq To SQL. Ai-je raté quelque chose ? Linq aurait-il une limitation technique (hardware, occupation mémoire, espace disque, etc…) ? Je n’ai pas trouvé d’article relatant du fait que Linq pourrait avoir quelques restrictions.

Voilà, voilà.

Pas à ma connaissance.

J’ai refait quelques tests en changeant de machine cliente. Le contenu du csv est aléatoire. :confused: La durée du traitement pour récupérer mes 990 000 lignes de données ne dépasse pas les 2 min. Donc, je doute que se soit lier au Timeout du DataContext sachant que j’ai modifié sa valeur par défaut à quelque chose de proche des 30000 (par contre, me souviens plus si c’était exprimé en secondes ou minutes).

Tu ne peux pas tracer un peu plus ton traitement ? Savoir combien de lignes sont renvoyées par ton select, l’écrire quelque part, ajouter des compteurs sur tes itérations, etc. ?

Découper ton opération en plusieurs DataContext ? C’est vrai qu’un datacontext ajoute un tracking sur tous les objets chargés, donc découper ton opération en groupe peut peut-être prévenir ce genre de soucis.

Un peu de Sql Profiler sinon ?

Ca serait con que ca soit en millisecondes, comme tellement de choses en C#:smiley:

ca ne serait pas plutot un pb de buffer de lecture? qu’à un moment tu sature.

Si tu veux de l’aide, il va falloir nous montrer du code je pense… Y’a pas mal de raison pour lesquelles ca pourrait peter

Il y avait rien qui me dit qu’il y a saturation. Du moins du côté des exception .NET. Je n’ai pas regardé du côté de l’observateur d’évènements. Je vous en dirais plus Demain. J’ai pas le source.

Voilà le bout de code de ma requête LinqToSQL

[code]public static IQueryable RetrieveAccountsFromList(string connexionString, Guid listid)
{
DataContext context = new DataContext(connexionString);
context.CommandTimeout = 150000;
Table Accounts = context.GetTable();
Table Listmembers = context.GetTable();
IQueryable query = from acc in Accounts
join lm in Listmembers on acc.AccountId equals lm.EntityId
where lm.ListId.Equals(listid)
orderby acc.Name ascending
select acc;

		return query;
	}[/code]

Et le bout de code qui appelle ma requete Linq:

[code]using (TextWriter twriter = TextWriter.Synchronized(File.AppendText(_defaultFilePath)))
{
var mkt_accounts = CrmFilteredAccount.RetrieveAccountsFromList(CRM_SQL_CONNEXION, list.ListId);
WriteCSV(twriter, fields, mkt_accounts);
}

// — Et le code dans WriteCSV
string values = string.Empty;
foreach (var row in results)
{
values = string.Empty;
foreach (string field in fields)
{
object[] attributes = row.GetType().GetProperties();
foreach (PropertyInfo prop in attributes)
{
if (prop.Name.ToLower() == field)
{
values += prop.GetValue(row, null) + “;”;
}
}
}
twriter.WriteLine(values);
}[/code]

Une piste à la con mais bon :

T’as essayé avec un StringBuilder pour “values” (à la place d’une string) ?

[quote=« EzecKiel, post:9, topic: 50870 »]Une piste à la con mais bon :

T’as essayé avec un StringBuilder pour « values » (à la place d’une string) ?[/quote]

Non, et c’est pas con. :smiley: Je teste ça.
Merci.

Edit: Bon, alors c’est mieux. Nettement mieux. Mais j’ai toujours le problème de lignes variables dans mon csv.
En faisant un Stringbuilder, je n’ai plus les 140 000 lignes mais bien les 994 000 lignes. Sauf que, il me manque quelques lignes. Et en fonction du nombres de colonnes à récupérer, le nombre de lignes varient. :confused:

Je vais voir si c’est pas un point-virgule qui s’est incrusté dans les données. C’est vraiment con si c’est ça.

Edit 2: Bon, apparemment, ce n’est même pas le séparateur qui pose problème. Je ne comprends plus rien.
Sinon, en fait, il ne me manque pas de lignes, j’ai plutôt des lignes en trop dont je ne sais absoluement pas d’où elles sortent.

Le CSV c’est un separateur de valeur ‹ ; › et un separateur de ligne ‹ \n › non ? C’est ptet un truc de ce genre quand meme :smiley:

J’avais pensé à ça après avoir généré plusieurs cvs en variant les colonnes. Et apparemment le « \n » ne suffit pas. Il n’existerait pas une fonction dans le Framework .NET 3.5 qui permet de virer tous les caractères inutiles (tabulation, saut de lignes, etc…) ?
Bon, sinon, je ferai autrement.

Problème résolu. Bon, dommage que la variable Environment.NewLine ne me permet pas de répérer tous les cas de saut de lignes. :confused:

[quote=“MetalDestroyer, post:12, topic: 50870”]J’avais pensé à ça après avoir généré plusieurs cvs en variant les colonnes. Et apparemment le “\n” ne suffit pas. Il n’existerait pas une fonction dans le Framework .NET 3.5 qui permet de virer tous les caractères inutiles (tabulation, saut de lignes, etc…) ?
Bon, sinon, je ferai autrement.

Problème résolu. Bon, dommage que la variable Environment.NewLine ne me permet pas de répérer tous les cas de saut de lignes. :/[/quote]

Au final c’était un problème de traitement de fin de ligne ?

Yep. Ca et le StringBuilder.

C’était vraiment con comme problème.

string.Trim ? avec les variations TrimStart et TrimEnd :smiley:

String.Trim ne vire pas plutôt les espaces ?

Ca vire tous les caractères “invisibles” comme les espaces, les tabulations etc.

jette un oeil ici :
http://msdn.microsoft.com/fr-fr/library/t9…28VS.80%29.aspx

Dans “NOTES”, il y a la liste de tous les caractères supprimés

Ya aussi une version qui prend un parametre… http://msdn.microsoft.com/fr-fr/library/d4…28VS.80%29.aspx
.Trim("\n"); doit grosso merdo equivaudre a .Replace("\n", string.Empty);