Załadowanie jednej kolumny z dużego pliku

0

Witam,

Potrzebuję załadować jedna kolumnę z bardzo dużego pliku ( 20 GB plik csv ).
Split odpada - wywala OutOfMemofyException.
Próbowałem ładować pojedyncze linie poprzez While(readline)m ale mniej więcej w połowie program się zacina i przestaje odpowiadać.

Chyba, że da się załadować wszystko na raz ? Ale w to akurat wątpię - 2250000 wierszy po 4000 kolumn każdy.
Da się załadować wszystko na raz prze zStreamReader. readToEnd, ale potem nie da sie tego podzielić przez split, przez ten błąd outOfMemoryException.

Czy zna ktoś sposób na operowanie takimi plikami ? Mój komputer ma 8 giga ramu, system win 7 64 bit

Pozdrawiam

0

Mam 8 giga ramu, będzie ciężko załadować jednorazowo cały 20 gigowy plik do memory mapped file. Dlatego szukam sposobu żeby ładować pojedyncze kolumny, nie potrzebuję wszystkich na raz.

2

To może być trudne, a dlaczego nie możesz odczytać cały plik, parsować linia po linii i odczytać tylko to co Ci jest potrzebne?

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="Program.cs" company="4programmers.net">
//   mr-owl, 4programmers.net, All Right Reserved
// </copyright>
// <summary>
//   Defines the Program type.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

namespace ConsoleApplicationParseLargeFile
{
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;

    class Program
    {
        static void Main(string[] args)
        {
            var fileName = "largeFile.csv";

            var items = GetData(fileName).ToArray();
        }

        private static IEnumerable<string> GetData(string fileName)
        {
            var arrayLength = 10;
            var myItemIndex = 1;

            using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                using (var sr = new StreamReader(fs, Encoding.Default))
                {
                    while (sr.Peek() > -1)
                    {
                        var line = sr.ReadLine();

                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }

                        var array = line.Split(new[] { ',' });

                        if (array.Length == arrayLength)
                        {
                            var item = array[myItemIndex];

                            yield return item;
                        }
                    }
                }
            }
        }
    }
}

mr-owl

0

Może nie tyle nie mogę, co przy takim ładowaniu program się zawiesza ( w sumie nie jestem pewien czy się zawiesza czy bardzo długo myśli and sensem życia ). Czasem dochodzi do 300000, czasem do 1600000 linii a potem kaput. No ale chyba nie mam innej opcji jak dalej próbować. Ciekawi mnie to, że ten plik mogę otworzyć przez sweetscape editor i dowolnie przeglądam ponad milion wierszy. No ale to jest tylko przeglądanie, bez edycji/zliczania kolumn/wierszy, a ja muszę właśnie zliczyć wszystkie cyfry występujące w poszczególnych kolumnach ... No nic, próbuję dalej

1 użytkowników online, w tym zalogowanych: 0, gości: 1