2013-12-21 5 views
1

Я пишу приложение форм Windows в VB.NET, которое обрабатывает HTTP-запросы и получает ответы JSON.Хранение большого количества текста (строк) для последующего использования

Я хотел бы сохранить все эти ответы JSON в файле, чтобы прочитать их в какой-то момент в будущем (строка за строкой), как если бы я делал запросы из файла вместо веб-сайта/API.

Я хотел бы, чтобы операции чтения были как можно быстрее, тогда как запись может быть относительно медленной. Таким образом, частота запроса http может быть от 1/секунды до 1/минута, тогда как я хотел бы прочитать данные очень быстро (я думаю, 500 мс или меньше?)

Прямо сейчас, я просто пишу каждый JSON string в виде новой строки текста в txt-файле. Однако строки длинны, и файлы становятся очень большими очень быстро.

Есть ли лучшее/альтернативное решение для хранения этих JSON/строк в компактной форме для быстрого чтения в дальнейшем?

+0

В зависимости от языка программирования и среды, которую вы используете. – JJJ

+0

Вы можете попробовать сжать текст как двоичный с GZip, а затем base64 закодировать его так, чтобы он все равно мог быть включен как текст в вашем JSON. Эффективность, хотя YMMV. – Jack

+0

@Juhana Я использую VB.net для применения в окнах. – rex

ответ

3

.NET Framework имеет встроенную поддержку, которая позволила бы это сделать.

В принципе, вам нужно будет взять строку и преобразовать ее в массив байтов. Затем вам придется дефлировать (zip) ваш массив байтов и преобразовать его в строку base64.

Public Function ZipString(stringToZip As String) As String 
    Dim returnValue As String = "" 

    Using output As New MemoryStream() 
     Using gzip As New DeflateStream(output, CompressionMode.Compress) 
      Using writer As New StreamWriter(gzip, Encoding.[Default]) 
       writer.Write(stringToZip) 
      End Using 
     End Using 

     returnValue = Convert.ToBase64String(output.ToArray()) 

    End Using 



    Return returnValue 

End Function 

Чтобы получить исходную строку, вы делаете противоположное:

Public Function UnZipString(stringToUnZip As String) As String 
    Dim returnValue As String = "" 


    Using inputStream As New MemoryStream(Convert.FromBase64String(stringToUnZip)) 
     Using gzip As New DeflateStream(inputStream, CompressionMode.Decompress) 
      Using reader As New StreamReader(gzip, System.Text.Encoding.UTF8) 
       returnValue = reader.ReadToEnd() 
      End Using 
     End Using 
    End Using 


    Return returnValue 

End Function 

Вы тогда сможете хранить JSON как архивный строку и распаковать его, когда вам это нужно.

+1

Да. Вы застегиваете строку JSON, а затем сохраняете ее в файле (или в базе данных). Вообще говоря, производительность Inflate/deflate приемлема, но вам нужно будет проверить, соответствует ли она вашим потребностям. –

+0

Просто, чтобы уточнить, означает ли это, что меньше места занято, потому что закодированная строка короче, чем ни одна закодированная? – rex

2

В целом, я бы предложил посмотреть базы данных NoSQL. Эти базы данных, использующие модель нереляционная (без SQL), чтобы улучшить производительность и некоторые из них (например, MongoDB ориентированы на хранение/извлечения объектов JSon непосредственно.

Другим вариантом было бы хранить JSon документы в поисковый сервер, такой как Solr, который мог бы хранить JSON objects directly.Этот сценарий был бы более подходящим, если вы хотите искать большое количество объектов JSON, как если бы они были документами. Использование Solr дает вам большую гибкость в способе хранения данных и дает вам отличный функции поиска.

Вы можете взглянуть на продвинутые подходы (NoSQL, Solr) и подумать, может ли кривая обучения и перехода новая технология вернет время инвестиций в отношении преимуществ производительности. Я бы сначала попытался использовать реляционную базу данных и , только если мои потребности в производительности настолько велики, то я бы протестировал подход NoSQL.

Надеюсь, я помог!

+0

Спасибо, я отредактировал вопрос, чтобы дать представление о требованиях к скорости. – rex

+0

Я бы все же предложил использовать более простое решение (реляционная модель), и если есть проблема с производительностью, рассмотрите возможность использования параметра NoSQL. Фактическая производительность связана со многими факторами (скорость диска, размер json и т. Д.). Как говорит Стив МакКонелл [предлагает] (http: //www.amazon.com/gp/product/0735619670? ie = UTF8 & tag = lstse01-20 & linkCode = as2 & camp = 1789 & creative = 9325 & creativeASIN = 0735619670) вы не должны делать никаких предположений о производительности. Вы должны просто измерить его, прежде чем принимать какие-либо решения. –

+0

Я читал о SQL DB. Я понимаю, что это будут только рамки, в которых данные хранятся и извлекаются, а базы данных будут храниться локально на моей машине? Можно ли настроить базу данных на одной машине и получить доступ к ней из другого? – rex

Смежные вопросы