Работа с очень огромным XML-файлом в C#

У меня есть этот очень огромный XML-файл размера 2.8 ГБ. Это - дамп статей польской Википедии. Размер этого файла очень проблематичен для меня. Задача состоит в том, чтобы искать этот файл некоторый большой объем данных. Все, что я имею, является заголовками статей. Я думал, что мог отсортировать это заголовки и использовать один линейный цикл через файл. Идея не так плоха, но статьи не отсортированы в алфавитном порядке. Они отсортированы по идентификатору, который я не знаю априорно.

Так, мое долгое размышление должно было сделать индекс того файла. Сохранить в другом файле (или база данных) строки в следующем формате: title;id;index (возможно, без идентификатора). Я мой другой вопрос я обратился за помощью с этим. Гипотеза была то, что, если у меня был индекс необходимого тега, я мог бы использовать просто простой Seek метод для перемещения курсора в файле, не читая все содержание, и т.д. Для меньших файлов я думаю, что это могло хорошо работать. Но на моем компьютере (ноутбук, C2D proc, Win7, VS2008) я получаю ошибку, что приложение не отвечает.

В моей программе я читаю каждую строку из файла и проверяю, содержит ли это тег, в котором я нуждаюсь. Я также считаю все байты, я считал и сохраняю строки в упомянутом выше формате. Таким образом, в то время как индексация программы зависается. Но до того времени индексный файл результата составляет 36.2 МБ, и последний индекс похож 2,872,765,202 (B), в то время как целый XML-файл является 3,085,439,630 B долго.

Моя треть думала, должен был разделить файл на мелкие кусочки. Чтобы быть точными в 26 частей (существует 26 букв на латинском языке), каждый содержащий только записи, запускающиеся для той же буквы, например, в a.xml все записи, которые заголовки запускают в букве "A". Заключительные файлы были бы похожи на десятки МБ, макс. приблизительно 200 МБ, я думаю. Но существует та же проблема с чтением целого файла.

Для чтения файла, я использовал, вероятно, самый быстрый путь: использование StreamReader. Я считал где-нибудь это StreamReader и XmlReader класс от System.Xml самые быстрые методы. StreamReader еще быстрее это XmlReader. Очевидно, что я не могу загрузить весь этот файл в память. Я установил только 3 ГБ RAM, и Win7 берет как 800MB-1GB, когда полностью загружено.

Таким образом, я обращаюсь за помощью. Что должно сделать лучшее. Дело в том, что поиск этот XML-файл должен быть быстрым. Должен быстрее затем загружать единственные страницы Wikipedia в формате HTML. Я даже не уверен, возможно ли это.

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

Я не уверен, существуют ли некоторые пределы приблизительно 1 длина вопроса, но я помещу здесь также образец своего исходного кода индексации.

while (reading)
{
    if (!reader.EndOfStream)
    {
        line = reader.ReadLine();
        fileIndex += enc.GetByteCount(line) + 2; //+2 - to cover characters \r\n not included into line
        position = 0;
    }
    else
    {
        reading = false;
        continue;
    }

    if (currentArea == Area.nothing)    //nothing interesting at the moment
    {
         //search for position of  tag
         position = MoveAfter("<title>", line, position);    //searches until it finds <title> tag
         if (position >= 0) currentArea = Area.title;
         else continue;
    }

    (...)

    if (currentArea == Area.text)
    {
         position = MoveAfter("<text", line, position);
         if (position >= 0)
         {
              long index = fileIndex;
              index -= line.Length;
              WriteIndex(currentTitle, currentId, index);
              currentArea = Area.nothing;
         }
         else continue;
     }
 }

 reader.Close();
 reader.Dispose();
 writer.Close();
 }

 private void WriteIndex(string title, string id, long index)
 {
     writer.WriteLine(title + ";" + id + ";" + index.ToString());
 }
</code></pre><p>Наилучшие пожелания и Заранее спасибо,</p><p>ventus</p><p>Править: Свяжите с дампом этой Wiki <a href="https://legkovopros.ru/go.php?url=http%3A%2F%2Fdownload.wikimedia.org%2Fplwiki%2F20100629%2F" rel="nofollow noreferrer" target="_parent">http://download.wikimedia.org/plwiki/20100629/</a></p></p>
         </div>
         <div class="votes-question">
            <div class="vote-count" itemprop="upvoteCount">7</div><i class="fa fa-thumbs-o-up"></i>
         </div>
         <div class="tags">
            <a href="/questions/tagged/c#" class="tag"  title="c#" rel="tag">c#</a> <a href="/questions/tagged/xml" class="tag"  title="xml" rel="tag">xml</a>         </div>
         <div class="clearfix"></div>
         <div class="action-time">
            задан Greg B            <span title="27 July 2010 в 08:29 ">27 July 2010 в 08:29 </span>
         </div>
         
         <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c" title="поделиться">поделиться</a>
      </div>
   </div>
  <div style="height:100px;margin:10px 0px;" class="">

    <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- siteask before post --> <ins class="adsbygoogle"      style="display:block;height:100px"
                                                                                                                             data-ad-client="ca-pub-2355906945027976"
                                                                                                                             data-ad-slot="" data-ad-format="auto"></ins>
    <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>

    </div>
   <div class="answers" id="answers">
   
      <h2 class="pull-left"><span itemprop="answerCount">8</span> ответов</h2>
      <div class="clearfix"></div>

      <div class="answer-pager">
         <div class="pagination">
                     </div>
      </div>

         
         <div class="answer accepted" id="947095" itemscope="" itemtype="http://schema.org/Answer" itemprop="acceptedAnswer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p>Ну, если это соответствует вашим требованиям, я бы сначала импортировал этот XML в RDMS, например SQL Server, а затем сделал бы запрос к этому SQL Server. </p>

<p>С правильными индексами (полнотекстовыми индексами, если вы хотите искать в большом количестве текста), это должно быть довольно быстро... </p>

<p>Это уменьшит большую часть накладных расходов, связанных с разбором XML-файла библиотеками... </p>                  </div>
                  <div class="votes-answer green">
                     
                     <div class="vote-count" itemprop="upvoteCount">6</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947095">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947096" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p> Что ж ... Если вы собираетесь искать его, я настоятельно рекомендую вам найти способ получше, чем иметь дело с самим файлом. Я предлагаю, как вы упомянули, поместить его в хорошо нормализованную и проиндексированную базу данных и выполнить там поиск. Все остальное, что вы делаете, будет в точности дублировать то, что делает база данных. </p>

<p> Однако на это потребуется время. <a href="http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx" rel="noreferrer"> XmlTextReader </a>, вероятно, ваш лучший выбор, он работает с одним узлом за раз.LINQ to XML также должен быть достаточно эффективной обработкой, но я не пробовал использовать его с большим файлом и поэтому не могу комментировать. </p>

<p> Могу я спросить: откуда взялся этот огромный XML-файл? Возможно, есть способ справиться с ситуацией в источнике, а не до обработки файла размером 3 ГБ. </p>                  </div>
                  <div class="votes-answer green">
                     
                     <div class="vote-count" itemprop="upvoteCount">7</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947096">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947097" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p>Мне нравится идея создания индекса - вы сохраняете свой код очень простым, и вам не нужны никакие ужасные зависимости вроде баз данных :)</p>

<p>Итак - создайте индекс, в котором вы будете хранить следующее </p>

<p><code>[содержимое для поиска]:[смещение байта к началу xml узла, который содержит содержимое]</code></p>

<p>Чтобы получить смещение байта, вам нужно создать свой собственный поток над входным файлом, и создать читателя из него. вы будете запрашивать позицию на каждом reader.Read(...). Пример индексной записи:</p>

<p><code>"Now is the winter of our discontent":554353</code></p>

<p>Это означает, что запись в xml-файле, содержащая "Now is the winter of our discontent", находится в узле в байтовой позиции 554,353. Примечание: я бы не отказался закодировать поисковую часть индекса так, чтобы не сталкиваться с используемыми разделителями. </p>

<p>Чтобы прочитать индекс, вы сканируете индекс на диске (т.е. не надо загружать его в память) в поисках нужной записи. Найдя ее, вы получите смещение байта. Теперь создайте новый поток над файлом .xml и установите его позицию на смещение байта - создайте новый считыватель и читайте документ с этой точки. </p>                  </div>
                  <div class="votes-answer green">
                     
                     <div class="vote-count" itemprop="upvoteCount">2</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947097">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947098" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p> вы можете сохранить файл в couchDB. Я написал для этого скрипт на Python: </p>

<pre><code>import couchdb
import datetime
import time
from lxml import etree

couch = couchdb.Server()
db = couch["wiki"]

infile = '/Users/johndotnet/Downloads/plwiki-20100629-pages-articles.xml'


context = etree.iterparse(source=infile, events=("end", ), tag='{http://www.mediawiki.org/xml/export-0.4/}page')


for event, elem in context:
    #dump(elem)
 couchEle = {}
 for ele in elem.getchildren():
  if ele.tag == "{http://www.mediawiki.org/xml/export-0.4/}id":
   couchEle['id'] = ele.text
  if ele.tag == "{http://www.mediawiki.org/xml/export-0.4/}title":
   couchEle['title'] = ele.text
  if ele.tag == "{http://www.mediawiki.org/xml/export-0.4/}revision":
   for subEle in ele.getchildren():
    if subEle.tag == "{http://www.mediawiki.org/xml/export-0.4/}text":
     couchEle['text'] = subEle.text


 db[couchEle['title']] = couchEle
</code></pre>

<p> Он должен импортировать всю статью с идентификатором, заголовком и текстом в couchDB. </p>

<p> теперь вы должны ввести такой запрос: </p>

<pre><code>code = '''
  function(doc) { 
   if(doc.title.indexOf("Brzeg") > -1) {
    emit(doc._id, doc);
   }

  }
  '''
results = db.query(code)
</code></pre>

<p> Надеюсь, это поможет! </p>                  </div>
                  <div class="votes-answer green">
                     
                     <div class="vote-count" itemprop="upvoteCount">1</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947098">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947099" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p><a href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx" rel="nofollow noreferrer">XmlReader</a> будет быстрым, но вам нужно проверить, достаточно ли он быстр в вашем сценарии. Предположим, что мы ищем значение, расположенное в узле под названием <code>Item</code>:</p>

<pre><code>using (var reader = XmlReader.Create("data.xml"))
{
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element && reader.Name == "Item")
        {
            string value = reader.ReadElementContentAsString();
            if (value == "ValueToFind")
            {
                // value found
                break;
            }
        }
    }
}
</code></pre>                  </div>
                  <div class="votes-answer">
                     
                     <div class="vote-count" itemprop="upvoteCount">0</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947099">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947100" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p> Единственный способ быстро выполнить поиск - это сохранить его в базе данных, как предлагали другие. Если база данных не вариант, то это, без сомнения, займет много времени. Я бы создал многопоточное приложение. Создайте рабочие потоки, которые будут читать данные и, возможно, помещать их в строковую очередь. Сделайте это как 5 потоков, сегментированных по всему файлу (так, чтобы один поток запускал начало, второй поток запускал 1/5 пути в файл, третий поток запускал 2/5 пути и т. Д. ). Между тем, у вас есть другой поток, который читает очередь строк и ищет то, что вы ищете. После этого удалите поток из очереди. Это займет некоторое время, но не должно вызывать сбоев или занимать много памяти. </p>

<p> Если вы обнаружите, что он потребляет много памяти, установите ограничение на количество элементов, которые может удерживать очередь, и приостановите потоки до тех пор, пока размер очереди не станет ниже этого порога. </p>                  </div>
                  <div class="votes-answer">
                     
                     <div class="vote-count" itemprop="upvoteCount">0</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947100">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947101" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p>Я бы сделал следующее:</p>

<p>1) Разбил XML на более мелкие файлы. Например, если XML выглядит так, то я бы создал один файл для каждого узла статьи с именем, соответствующим атрибуту title. Если название не уникально, то я бы просто пронумеровал файлы. </p>

<p>Поскольку файлов много, я бы разбил их на подкаталоги, в каждом из которых было бы не более 1 000 файлов. </p>

<pre><code><root>
    <article title="aaa"> ... </article>
    <article title="bbb"> ... </article>
    <article title="ccc"> ... </article>
</root>
</code></pre>

<p>2) Создайте индексную таблицу с именами файлов и столбцами, по которым вы хотите искать. </p>

<p>3) Как вариант, вы можете хранить фрагменты XML в базе данных, а не на жестком диске. Для этого хорошо подходит тип varChar(MAX) SQL Server. </p>                  </div>
                  <div class="votes-answer">
                     
                     <div class="vote-count" itemprop="upvoteCount">0</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947101">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
            
         <div class="answer" id="947102" itemscope="" itemtype="http://schema.org/Answer">
            <div class="answer-row">
               <div class="answer-text">
                  <div class="description" itemprop="text">
                     <p> Выгрузите его в индекс Solr и используйте его для поиска. Вы можете запустить Solr как автономную поисковую систему и простой скрипт, чтобы перебрать файл и выгрузить каждую статью в индекс. Затем Solr дает вам полнотекстовый поиск по любым полям, которые вы решили проиндексировать ... </p>                  </div>
                  <div class="votes-answer">
                     
                     <div class="vote-count" itemprop="upvoteCount">0</div><i class="fa fa-thumbs-o-up"></i>
                  </div>
                  <div class="clearfix"></div>
                  <div class="action-time">
                     ответ дан                      <span title="6 December 2019 в 12:45 ">6 December 2019 в 12:45 </span>
                  </div>
                  <a class="s-link" href="/questions/427790/rabota-s-ochen-ogromnym-xml-fajlom-v-c#584" title="поделиться">поделиться</a>
               </div>
                              <div class="post-layout--right">
                  <div id="comments-947102">
                     <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true">
      
                                         </ul>
                  </div>
               </div>
            </div>
         </div>
         
               <div style="margin-top: 20px;">
          Другие вопросы по тегам:          <div class="tags" style="display: inline-block; float: none;">
         <a href="/questions/tagged/c#" class="tag"  title="c#" rel="tag">c#</a> <a href="/questions/tagged/xml" class="tag"  title="xml" rel="tag">xml</a>       </div>
        <h3 class="m-t-20">Похожие вопросы:</h3>

        <div class="related-block">
          <ul>
                          <li><div class='votes-answer green'><span class='vote-count'>295</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/89499/skrytye-vozmozhnosti-c-zakryto" title="Скрытые возможности C #? [закрыто]">Скрытые возможности C #? [закрыто]</a> - 25 September 2017 20:53 </li>
                            <li><div class='votes-answer green'><span class='vote-count'>115</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/83765/kakie-vashi-ljubimye-metody-rasshirenija-dlja-c-codeplex-com-extensionoverflow" title="Какие ваши любимые методы расширения для C #? (Codeplex.com/extensionoverflow)">Какие ваши любимые методы расширения для C #? (Codeplex.com/extensionoverflow)</a> - 23 May 2017 12:18 </li>
                            <li><div class='votes-answer green'><span class='vote-count'>81</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/96626/ispolzovanie-kljuchevogo-slova-var-v-c" title="Использование ключевого слова var в C #">Использование ключевого слова var в C #</a> - 3 February 2015 03:25 </li>
                            <li><div class='votes-answer green'><span class='vote-count'>51</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/138697/pochemu-eto-schitajut-plohoj-praktikoj-dlja-iskljuchenija-figurnyh-skobok-zakrytyj" title="Почему это считают плохой практикой для исключения фигурных скобок? [закрытый]">Почему это считают плохой практикой для исключения фигурных скобок? [закрытый]</a> - 19 August 2016 17:07 </li>
                            <li><div class='votes-answer green'><span class='vote-count'>48</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/96780/chto-takoe-hudshaja-oshibka-v-c-ili-net-zakryto" title="Что такое худшая ошибка в C # или .NET? [закрыто]">Что такое худшая ошибка в C # или .NET? [закрыто]</a> - 13 August 2015 04:30 </li>
                            <li><div class='votes-answer green'><span class='vote-count'>41</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/125521/chto-za-i-protiv-javljajutsja-k-uderzhaniju-sql-sohranennym-procs-po-sravneniju-s-zakrytym-kodom" title="Что за и против являются к удержанию SQL Сохраненным Procs по сравнению с [закрытым] Кодом">Что за и против являются к удержанию SQL Сохраненным Procs по сравнению с [закрытым] Кодом</a> - 27 October 2008 14:46 </li>
                            <li><div class='votes-answer green'><span class='vote-count'>39</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/131674/dejstvitelno-li-xslt-stoit-togo-zakrytyj" title="Действительно ли XSLT стоит того? [закрытый]">Действительно ли XSLT стоит того? [закрытый]</a> - 14 March 2011 17:13 </li>
                          </ul>
        </div>

      </div>
   </div>
   
</div>      </div>
      <aside class="sidebar">
        <div class="awrap">

<script async src="https://yastatic.net/pcode-native/loaders/loader.js"></script>
<script>
    (yaads = window.yaads || []).push({
        id: "553274-2",
        render: "#id-553274-2"
    });
</script>
<div id="id-553274-2"></div>
          <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
     style="display:inline-block;width:300px;height:600px"
     data-ad-client="ca-pub-2355906945027976"
     data-ad-slot="8038370725"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>


        </div>
      </aside>

    </div>
  </div>
  <footer class="footer">
    <div class="wrapper wrapper--sm">
      <div class="footer-navs-col">
        <div class="footer-nav footer-nav--menu">

          <div class="footer-coryright">© 2017 - 2020 Вопросы и ответы по программированию</div>
        </div>
        <div class="footer-nav footer-nav--catalog">
        </div>
      </div>
      <div class="footer-contacts-col">
        <div class="soc-widget-col">
        </div>
      </div>
      <div class="clearfix"></div>
    </div>

  </footer>

</div>

<script type="text/javascript" src="/js/ui/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="/js/ui/external/jquery.cookie.js"></script>

<script type="text/javascript" src="/js/versions/menu.ru.u1607887878.js"></script>


<script type="text/javascript" src="/js/jquery.fancybox.min.js"></script>
<script type="text/javascript" src="/js/slick.min.js"></script>
<script type="text/javascript" src="/js/jquery.maskedinput.min.js"></script>

<script type="text/javascript" src="/js/versions/scripts.ru.u1607887878.js"></script>


<!-- Yandex.Metrika counter --> <script type="text/javascript" > (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; var z = null;m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(90030325, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/90030325" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter -->


<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123993370-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-123993370-1');
</script>

</div>
<script type="application/ld+json">
  {
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Программирование - вопросы и ответы",
  "alternateName": "Программирование - вопросы и ответы",
  "url": "https://legkovopros.ru",
  "potentialAction": {
     "@type": "SearchAction",
     "target": "https://legkovopros.ru/search?search={search_term_string}",
     "query-input": "required name=search_term_string"
   }
}
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Программирование - вопросы и ответы",
  "url": "https://legkovopros.ru",
  "logo": "https://legkovopros.ru/i/logo.png",
  "email": "info@legkovopros.ru",
   "telephone": ""

}




</script>
</body>
</html>