2016-07-25 5 views
6

Я пытаюсь разобрать файлы JSON и вставить в SQL DB. Мой парсер работал отлично, если файлы маленькие (менее 5 МБ).Чтение большого файла JSON в переменную в C# .net

При попытке прочитать большие (> 5 МБ) файлы я получаю исключение «из памяти».

if (System.IO.Directory.Exists(jsonFilePath)) 
       { 
        string[] files = System.IO.Directory.GetFiles(jsonFilePath); 
        foreach (string s in files) 
        { 
         var jsonString = File.ReadAllText(s); 
         fileName = System.IO.Path.GetFileName(s); 
         ParseJSON(jsonString, fileName); 

        } 
       } 

Я попробовал подход JSONReader, но не повезло на получение всей JSON в строку или variable.Please посоветуйте.

+2

то, что„большой“ ? 5.1meg? 5555555555 мегабайт? –

+0

* Я пробовал подход JSONReader, но не повезло получить весь JSON в строку или переменную. * Если «JSONReader» вы имеете в виду ['JsonTextReader'] (http: //www.newtonsoft. com/json/help/html/T_Newtonsoft_Json_JsonTextReader.htm) от Json.NET, можете ли вы поделиться тем, что вы пробовали, но не сработали? – dbc

+0

foreach (строка s в файлах) {fileName = System.IO.Path.GetFileName (s); с использованием (WebClient client = new WebClient()) {using (Strea mReader ср = новый StreamReader (client.OpenRead (jsonFilePath + имя_файл))) {использование (JsonReader читатель = новый JsonTextReader (ср)) {вар jsonString = reader.Value.ToString(); ParseJSON (jsonString, имя_файл) } } } – user1046415

ответ

2

Использование 64 бит, проверьте ответ RredCat на подобный вопрос:

Newtonsoft.Json - Out of memory exception while deserializing big object

NewtonSoft Jason Performance Tips

Читать статью Дэвида Кокса о tokenizing:

"Основной подход заключается в используйте объект JsonTextReader, который является частью библиотеки Json.NET. JsonTextReader читает файл JSON по одному токену за раз, поэтому он позволяет избежать накладных расходов на чтение e ntire в строку. Поскольку маркеры считываются из файла, объекты создаются и помещаются в стек и выходят из него. Когда конец файла достигнут, в верхней части стека содержит один объект - вершина очень большого дерева объектов, соответствующих объектам в оригинальном формате JSON файл "

Parsing Big Records with Json.NET

-1

Файл json слишком велик, чтобы вставлять его в память в любой форме.

Вы должны использовать считыватель JSON, который принимает имя файла или поток в качестве входных данных. Из вашего вопроса, который вы используете JSON Reader, неясно. Из какой библиотеки?

Если ваш JSON-ридер строит все дерево JSON, у вас все еще будет нехватка памяти. Когда вы читаете файл JSON, либо вишня выбирает данные, которые вы ищете, либо записываете структуры данных в другой формат на диске, который можно легко запросить, например, базу данных sqlite.

+0

Я должен прочитать весь файл и хранить в SQL DB путем формирования наборов данных. – user1046415

+0

Затем используйте считыватель JSON, который принимает имя файла или поток в качестве входных данных. –

+0

мои файлы Json больше 5 МБ. – user1046415