2016-06-08 8 views
2

Ich versuche, die Textdatei zu lesen, um zu überprüfen, ob alle Zeilen die gleiche Anzahl von Spalten haben oder nicht. Im lokalen Code funktioniert es gut, aber im Netzwerk freigegebenen Ordner (hat die Berechtigung als Jeder) funktioniert es nur für kleine Größe (5 MB) Datei und wenn ich 10 MB oder 500 MB Datei auswählen, funktioniert der gleiche Code nicht (funktioniert nicht Es dauert einige Zeit, aber nach ein paar Minuten wird die Seite aktualisiert, das ist es). Es gibt keinen Fehler oder zeigt keine Nachricht an. Unten ist der Code die Datei zu lesen und die SpaltenKann große Datei des freigegebenen Netzwerkordners nicht lesen

LinesLst = File.ReadLines(_fileName, Encoding.UTF8) 
    .Select((line, index) => 
     { 
      var count = line.Split(Delimiter).Length; 
      if (NumberOfColumns < 0) 
       NumberOfColumns = count; 

      return new 
      { 
       line = line, 
       count = count, 
       index = index 
      }; 
     }) 
    .Where(colCount => colCount.count != NumberOfColumns) 
    .Select(colCount => colCount.line).ToList();  
+2

"Es gibt keinen Fehler oder zeigt keine Nachricht" - das ist wirklich unwahrscheinlich. Wenn Sie Windows benutzen, würde es Fehler im Ereignisprotokoll geben ... Andernfalls verwenden Sie eine Protokollierungsbibliothek, um Fehler zu erfassen und zu löschen. –

+0

gibt es sowieso, um die Leistung des Codes zu verbessern, so wird der Prozess schneller als Datei ist große Datei (500 MB) – Rocky

+1

Wenn es keine Fehlermeldung gibt, wie wissen Sie, dass es nicht funktioniert? Sind Sie sicher, dass Ihnen nicht genug Speicher zur Verfügung steht? Es wäre schwierig, eine enorme Leistungsverbesserung zu erzielen, weil das Lesen der Datei der größte Engpass sein wird. –

Antwort

0

ich hinzugefügt haben, ersetzen AsyncPostBackTimeout = "36000", das mein Problem gelöst.

0

Vielleicht haben Sie OutOfMemoryException auf große Datei zählen zu bekommen. Fakt ist, dass bei jeder Iteration viele Objekte im Code erzeugt werden: das String-Array von line.Split und ein anonymes Objekt. Unterdessen wird das anonyme Objekt tatsächlich nicht benötigt. Ich würde neu geschrieben als so den Code:

LinesLst = File.ReadLines(_fileName, Encoding.UTF8) 
    .Where(line => 
    { 
     var count = line.Split(Delimiter).Length; 
     if (NumberOfColumns < 0) 
      NumberOfColumns = count; 

     return count != NumberOfColumns; 
    }) 
    .ToList(); 

Darüber hinaus können Sie versuchen, von der Erstellung des String-Array, um loszuwerden, wenn Sie die line.Split nennen. Probieren Sie die Zeichenfolge

var count = line.Split(Delimiter).Length; 

auf den String

// Assume that Delimiter is char[] 
var count = line.Count(c => Delimiter.Contains(c)) + 1; 

// Assume that Delimiter is char 
var count = line.Count(c => Delimiter == c) + 1;