Excel больше 1 млн строк

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2019 Excel 2016 Еще…Меньше

Если вы открыли файл с большим набором данных в Excel, например файл с разделителями (.txt) или файл с разделителями-запятыми (.csv), возможно, вы видите предупреждающее сообщение «Этот набор данных слишком велик для сетки Excel. Если вы сохраните эту книгу, вы потеряете данные, которые не были загружены.«Это означает, что набор данных превышает количество строк или столбцов, доступных в Excel, поэтому некоторые данные не были загружены. 

Предупреждающее сообщение: "Этот набор данных слишком велик для сетки Excel. Если вы сохраните эту книгу, вы потеряете данные, которые не были загружены.

 Важно принять дополнительные меры предосторожности, чтобы избежать потери данных:

  • Откройте файл в Excel для пк с помощью команды Получить данные. Если у вас есть приложение Excel для пк, вы можете использовать Power Query для загрузки полного набора данных и анализа его с помощью сводных таблиц.

  • Не сохраняйте файл в Excel . Если сохранить исходный файл, вы потеряете все данные, которые не были загружены. Помните, что это также неполный набор данных.

  • Сохранить усеченную копию . Если вам нужно сохранить файл, перейдите в раздел Файл > Сохранить копию. Затем введите другое имя, которое ясно, что это усеченная копия исходного файла.

Как открыть набор данных, превышающий ограничения сетки Excel

Использование Excel для ПК означает, что вы можете импортировать файл с помощью команды Получить данные для загрузки всех данных. Хотя данные по-прежнему не отображаются больше, чем количество строк и столбцов в Excel, полный набор данных существует, и вы можете проанализировать его без потери данных.

  1. Откройте пустую книгу в Excel.

  2. Перейдите на вкладку Данные > Из текста или CSV > найдите файл и выберите Импорт. В диалоговом окне предварительного просмотра выберите Загрузить в… > отчет сводной таблицы.

  3. После загрузки используйте список полей для упорядочения полей в сводной таблице. Сводная таблица будет работать со всем набором данных для сводных данных.

  4. Вы также можете сортировать данные в сводной таблице или фильтровать данные в сводной таблице.

Дополнительные сведения об ограничениях форматов файлов Excel

При использовании Excel важно отметить, какой формат файла вы используете. Формат файла .xls имеет ограничение в 65 536 строк на каждом листе, а формат файла .xlsx имеет ограничение в 1 048 576 строк на лист. Дополнительные сведения см. в разделе Форматы файлов, поддерживаемые вспецификациях и ограничениях Excel и Excel.

Чтобы предотвратить достижение лимита в Excel, убедитесь, что используется формат .xlsx вместо формата .xls, чтобы воспользоваться преимуществами гораздо большего ограничения. Если вы знаете, что набор данных превышает ограничение .xlsx, используйте альтернативные обходные пути, чтобы открыть и просмотреть все данные.

Совет: Убедитесь, что все данные импортированы при открытии набора данных в Excel. Вы можете проверить количество строк или столбцов в исходном файле, а затем подтвердить его соответствие в Excel. Для этого выделите всю строку или столбец и просмотрите счетчик в строке состояния в нижней части Excel.

Статьи по теме

Сохранение книги в текстовом или CSV-файле

Импорт и экспорт текстовых файлов (.txt или .csv)

Импорт данных из внешних источников данных (Power Query)

Нужна дополнительная помощь?

Существует ограничение в 1 048 576 строк, которое можно просматривать / просматривать в Excel 2007/2010.

В этом случае файл содержит 1,2 миллиона строк и, таким образом, хотя строки существуют в файле, их нельзя просмотреть / открыть в Excel.

Лицо, предоставляющее данные, предлагает не использовать Excel для открытия файлов.

Один из возможных подходов к просмотру необработанных данных — при условии, что это «распакованный файл.xslx»1) — использовать Блокнот для открытия файла (если Блокнот не работает, запись может). Вот несколько подходов сделать это:

  1. Щелкните правой кнопкой мыши по файлу и перейдите к «Открыть с помощью -> Выбрать программу по умолчанию..», затем выберите «Блокнот» (обязательно снимите флажок «Всегда использовать..»);
  2. Переименуйте расширение файла в «.txt», чтобы оно было связано с обычным редактором (возможно, «Блокнотом») по умолчанию;
  3. Запустите Блокнот, а затем «Открыть» указанный файл.

Если данные были предоставлены в CSV, все строки не могли быть просмотрены в Excel (например, после импорта) из-за указанного ограничения. Если этот файл является «распакованным.xsls», тогда данные уже являются обычным текстом, и файл с расширением.xsls (vs .txt) в значительной степени не имеет значения — расширение существует для ассоциации программы / файла.

Другой вариант — посмотреть, может ли другая программа для работы с электронными таблицами (например, Open Office Calc, Kingsoft Office Suite) отображать такое количество строк. YMMV.


1 Не все файлы «.xslx» одинаковы, и Excel довольно снисходительно относится к формату данных, содержащемуся в файлах с таким расширением, которые можно открыть. В этом случае другой человек кажется уверенным, что разумно рассматривать этот файл как необработанный текст — даже если работа с данными, вероятно, будет громоздкой.

Вопрос

Мне дали CSV-файл, содержащий больше, чем MAX Excel может обработать, и мне очень нужно иметь возможность видеть все данные. Я понял и попробовал метод «разделения», но он не работает.

Немного предыстории: CSV-файл — это файл Excel CSV, и человек, который дал файл, сказал, что в нем около `2 млн. строк данных.

Когда я импортирую его в Excel, я получаю данные до строки 1,048,576, затем повторно импортирую его в новой вкладке, начиная со строки 1,048,577 в данных, но это дает мне только одну строку, а я точно знаю, что их должно быть больше (не только из-за того, что «человек» сказал, что их больше 2 миллионов, но и из-за информации в последних нескольких наборах строк).

Я подумал, что, возможно, причина этого в том, что мне предоставили CSV-файл в формате Excel CSV, и поэтому вся информация после 1,048,576 потеряна (?).

Нужно ли мне запрашивать файл в формате базы данных SQL?

42
2013-06-05T16:37:49+00:00
12

 skyliner28

Ответ на вопрос

30-го июня 2013 в 3:23

2013-06-30T15:23:08+00:00

#19566374

Попробуйте delimit, он может быстро открыть до 2 миллиардов строк и 2 миллионов столбцов, есть бесплатная 15-дневная пробная версия. Для меня это отличная работа!

Martijn  van der Jagt

Ответ на вопрос

30-го апреля 2014 в 9:19

2014-04-30T09:19:24+00:00

#19566377

Я бы предложил загрузить файл .CSV в MS-Access.

Затем в MS-Excel вы можете создать соединение данных с этим источником (без фактической загрузки записей в рабочий лист) и создать подключенную поворотную таблицу. Вы можете иметь практически неограниченное количество строк в таблице (в зависимости от процессора и памяти: у меня сейчас 15 миллионов строк при 3 Гб памяти).

Дополнительным преимуществом является то, что теперь вы можете создавать агрегированные представления в MS-Access. Таким образом, вы можете создавать обзоры из сотен миллионов строк и затем просматривать их в MS-Excel (помните об ограничении в 2 Гб для файлов NTFS в 32-битных ОС).

 user2769406

Ответ на вопрос

11-го сентября 2013 в 3:39

2013-09-11T15:39:03+00:00

#19566375

Сначала нужно изменить формат файла с csv на txt. Это легко сделать, просто отредактируйте имя файла и измените csv на txt. (Windows выдаст предупреждение о возможном повреждении данных, но все в порядке, просто нажмите OK). Затем сделайте копию txt-файла, чтобы теперь у вас было два файла с 2 миллионами строк данных. Затем откройте первый txt-файл, удалите второй миллион строк и сохраните файл. Затем откройте второй файл txt, удалите первый миллион строк и сохраните файл. Теперь измените оба файла обратно в csv так же, как вы изменили их в txt.

 fvu

Ответ на вопрос

5-го июня 2013 в 4:49

2013-06-05T16:49:59+00:00

#19566372

Excel 2007+ ограничен количеством строк, несколько превышающим 1 миллион (2^20, если быть точным), поэтому он никогда не загрузит ваш файл с 2 миллионами строк. Я думаю, что техника, на которую вы ссылаетесь как на разделение, является встроенной в Excel, но afaik она работает только для ширины проблем, а не для длины проблем.

Действительно самый простой способ, который я вижу сразу, это использовать какой-нибудь инструмент для разделения файлов — их там ‘куча и использовать его для загрузки полученных частичных csv файлов в несколько рабочих листов.

ps: «excel csv файлы» не существуют, есть только файлы, создаваемые Excel, которые используют один из форматов, обычно называемых csv файлами…

Simple Text Splitter download | SourceForge.net

Download Simple Text Splitter for free. A very simple text splitter that can split text based files (txt, log, srt etc.) into smaller chunks.

sourceforge.net

Microsoft Support

Microsoft support is here to help you with Microsoft products. Find how-to articles, videos, and training for Office, Windows, Surface, and more.

office.microsoft.com

 Psi-Ed

Ответ на вопрос

5-го апреля 2016 в 1:15

2016-04-05T13:15:51+00:00

#19566379

Если у вас есть Matlab, вы можете открывать большие файлы CSV (или TXT) через его импорт. Инструмент предоставляет различные параметры формата импорта, включая таблицы, векторы столбцов, числовую матрицу и т. Д. Однако, поскольку Matlab является пакетом интерпретаторов, для импорта такого большого файла требуется свое время, и я смог импортировать его с более чем 2 миллионами строк примерно за 10 минут.

Инструмент доступен через вкладку «Главная» Matlab, нажав кнопку «Импорт данных». Пример изображения большой загрузки файла показан ниже:
введите описание изображения здесь
После импорта данные отображаются в рабочей области справа, которая затем может быть дважды щелкнута в формате Excel и даже нанесена на график в разных форматах.
введите описание изображения здесь

Fiddy Bux

Ответ на вопрос

18-го мая 2018 в 8:20

2018-05-18T20:20:52+00:00

#19566382

Я смог без проблем отредактировать большой файл csv объемом 17 ГБ в Sublime Text (нумерация строк позволяет намного легче отслеживать ручное разделение), а затем свалить его в Excel на куски размером менее 1 048 576 строк. Просто и довольно быстро — менее глупо, чем исследование, установка и обучение индивидуальных решений. Быстро и грязно, но это работает.

Timothy Wachiuri

Ответ на вопрос

22-го ноября 2016 в 6:42

2016-11-22T06:42:00+00:00

#19566380

Используйте MS Access. У меня есть файл из 2 673 404 записей. Он не откроется в блокноте ++, и Excel не загрузит более 1 048 576 записей. Он ограничен вкладкой, поскольку я экспортировал данные из базы данных mysql, и они мне нужны в формате csv. Поэтому я импортировал его в Access. Измените расширение файла на .txt, чтобы MS Access провел вас через мастер импорта.

MS Access свяжется с вашим файлом, чтобы база данных оставалась неизменной и сохраняла файл csv

David  García Bodego

Ответ на вопрос

4-го сентября 2019 в 5:55

2019-09-04T05:55:25+00:00

#19566383

Я нашел этот предмет исследования.
Существует способ скопировать все эти данные в таблицу данных Excel.
(У меня есть эта проблема раньше с файлом CSV из 50 миллионов строк)
Если есть какой-либо формат, дополнительный код может быть включен.
Попробуй это.

 Dredge

Ответ на вопрос

5-го мая 2015 в 3:21

2015-05-05T15:21:05+00:00

#19566378

Разделите CSV на два файла в блокноте. Это боль, но после этого вы можете просто редактировать каждый из них по отдельности в Excel.

Похожие сообщества
2

Excel Chat

excel_ru

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

Добрый день!

Подскажите, пожалуйста как оптимально по скорости/памяти решить следующую задачу:  

Имеются ежемесячные выгрузки из внешней системы, на которую я никак повлиять не могу.
Выгрузки представляют из себя текстовые файлы с разделителямя (зачисления).
Размер файла 1,5 — 2 ГБ и количество строк более 10 млн. Каждая строка = 1 зачисление , около 30 полей, из которых мне нужно только 5. (ФИО, Сумма, Дата операции, Дата рождения, тип зачисления) . Для одного клиента может быть несколько  зачислений (строчек).

Есть справочник клиентов (текстовый файл ~4 млн.записей), в котором хранятся только ФИО + Дата рождения

Мне необходимо из первого файла выбрать клиентов которые отсутствуют в справочнике и удовлетворяют определенным условиям. Таких ежемесячно бывает примерно 30-40 тыс. ФИО + ДР отобранных добавляем в справочник.

Соответственно,  чтобы решить данную задачу мне сейчас необходимо понять следующее:
1. Как правильно с точки зрения скорости/памяти считать текстовый файл в массив если я не знаю количество строчек в нем.Мне нужно будет в какой-то момент менять размерность массива, как это сделать лучше?

2. Прежде чем сравнивать массивы, по-любому придется их сортировать по полю ФИО. Подскажите пожалуйста самый быстрый алгоритм, который не использует вспомогательные массивы. Не хочется делать дополнительные копии массива в памяти.    

 

А точно это должен быть Excel? Тут пора применять Access…

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#3

26.08.2015 17:43:55

в любом случае, я бы посоветовала через ADO+SQL — количество строк знать не надо, обращение к txt c разделителем — как  к столбцам, отбор сделать нужной SQL командой… примеры примерно такие:

Точное считывание с текстового файла
ADO в Excel и большой размер файла

Цитата
tvit написал:
1. … считать текстовый файл …?
2. … сортировать по полю ФИО. …

— и уже в SQL-команду можно вставить нужные условия отбора WHERE, и Сортировку по нужному полю ORDER BY
P.S.(согласна с Максимом)
пример:

Использование Access для обработки больших текстовых файлов

#17

Изменено: JeyCi26.08.2015 18:09:51

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#4

26.08.2015 20:07:19

Доброе время суток

Цитата
Размер файла 1,5 — 2 ГБ и количество строк более 10 млн. Каждая строка = 1 зачисление , около 30 полей, из которых мне нужно только 5. (ФИО, Сумма, Дата операции, Дата рождения, тип зачисления) . Для одного клиента может быть несколько  зачислений (строчек).
Есть справочник клиентов (текстовый файл ~4 млн.записей), в котором хранятся только ФИО + Дата рождения

Такой объём явно выгружен из какой-то базы данных, что-то с трудом вериться, что кто-то в блокноте ведёт эти записи. Стоит ли тогда «огород городить» с выгрузкой и анализом через сравнение массивов, или даже, как предлагают, связывать текстовые данные в Access для построения запросов? Может сразу в этой же базе SQL-запросами получать требуемое?

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Думаю вполне можно и кодом работу сделать — сперва читаем справочник в словарь, можно всё в массив, или построчно прочитать.
Затем читаем построчно гигабайты, проверяем свои определённые условия и затем наличие в словаре — если нужно отобрать, то отбираем в коллекцию или другой словарь (так не нужно думать о размерности).
В итоге собранное дописываем в справочник, реализация по вкусу (можно циклом по одному, можно сразу всё выгрузить — думаю разница на общем фоне не будет существенной).

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

Спасибо всем ответившим, только я другие вопросы задавал. :-)
Через SQL задача уже реализована и работает, проблема в том, что это нужно передать другому человеку в другой город, у которого есть только Excel и Word

To HUGO: Вариант с заменой массивов словарем рабочий,  вопрос только на сколько это будет медленнее по скорости чем с массивами? И еще вопрос, помню как то работал со словарем и там был глюк, который я так и не смог обойти: При проверки наличия значения в словаре оно почему-то самопроизвольно добавлялось в этот словарь, я так и не смог до конца разобраться в проблеме посему так происходит?

PS На выгружаемый файл из внешней системы я никак повлиять не могу, считайте что мне его робот по почте присылает :-)

 
 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#8

27.08.2015 08:05:07

Доброе время суток

Цитата
Через SQL задача уже реализована и работает
Цитата
проблема в том, что это нужно передать другому человеку в другой город

Не совсем понимаю суть проблемы, почему нужно другому человеку отправлять исходные данные, чтобы он у себя в Excel их обрабатывал? А почему нельзя отправить уже реализованный результат?
Почему у вас ошибка со словарём — надо смотреть ваш код. Проверка наличия ключа в словаре выполняется Dictionary.Exists(KeyValue) — словарь это пара ключ/значение.

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#9

27.08.2015 08:32:34

Цитата
tvit написал:
на сколько это будет медленнее по скорости чем с массивами?

это будет быстрее. в разы, скорее — в десятки раз.

Цитата
tvit написал:
работал со словарем и там был глюк, который я так и не смог обойти: При проверки наличия значения в словаре оно почему-то самопроизвольно добавлялось в этот словарь

это не глюк.
для проверки следует использовать Exists, любое другое обращение к несуществующему элементу — добавляет его.
это штатное поведение словаря.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

#10

27.08.2015 09:04:35

Цитата
StepanWolkoff написал: А версия Excel какая?

2010

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

#11

27.08.2015 09:18:26

Получается если считывать в Коллекцию

Цитата
Андрей VG написал: почему нужно другому человеку отправлять исходные данные, чтобы он у себя в Excel их обрабатывал?

Данные никто никому не отправляет, другой человек сам их выгрузит из той же внешней системы

Цитата
Андрей VG написал: Проверка наличия ключа в словаре выполняется Dictionary.Exists(KeyValue) — словарь это пара ключ/значение.

Сейчас уже не вспомню, возможно я действительно проверял более «хитрым» способом (присваивание внутри on error)

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#12

27.08.2015 09:38:01

Цитата
другой человек сам их выгрузит из той же внешней системы

Вы правда не назвали, что это за система. Но всё равно не понимаю, если человек имеет к ней доступ, то кто мешает ему получать (в том числе и обновляемые) данные, используя SQL, в книгу Excel?
Например, для MS SQL Server

Код
    Const connStr As String = "ODBC;Driver={SQL Server Native Client 11.0};Server=(localdb)mssqllocaldb;Database=SampleDb;Trusted_Connection=yes;"
    Dim pLO As ListObject, pSheet As Worksheet
    Set pSheet = ThisWorkbook.Worksheets.Add
    Set pLO = pSheet.ListObjects.Add(xlSrcExternal, connStr, True, xlYes, pSheet.Range("A1"))
    With pLO.QueryTable
        .CommandType = xlCmdSql
        .CommandText = "Select * From Production.Products"
        .Refresh
    End With

Естественно, CommandText может быть более сложным SQL запросом, чем в приведённом примере. Можно это же сделать и без программирования, задействовав MS Query.

Изменено: Андрей VG27.08.2015 09:47:06

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Я думаю что SQL будет работать намного медленнее кода на словаре и массивах.
На работе простая выборка по одному полю из 12 тысяч записей работает секунд наверное 40 на 2007 ацессе — она же ранее на 2003 отрабатывала не раздражая… хотя тоже не пулей. Не работаю регулярно с ацесс, и не вникал, т.е. это не моя каждодневная рабочая задача, но удивляет такая медлительность…

 

Dmitryktm

Пользователь

Сообщений: 17
Регистрация: 30.10.2014

Попробуйте посмотреть в сторону надстроек Power Pivot или Power Query. Последняя надстройка (PQ) вообще творит чудеса. Может сделать всё что угодно и как угодно без макросов. Поддерживаются следующие версии Office:

    • Microsoft Office 2010 Professional Plus c Software Assurance
    • Microsoft Office 2013
 

Поддерживаю Dmitryktm, поэтому и был вопрос про версию.
Из личного опыта — скармливал одновременно три таблицы (текстовых файла) 21млн, 7млн и 300тыс.
Тут главное оперативной памяти не жалеть)))

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

Dmitryktm, спасибо, но это не вариант. Я не администратор своей машины, и тот человек кому я передаю программу тоже ничего не сможет установить.

Сейчас пробую вариант с коллекциями. Excel занял 1.2 ГБ оперативки. пока работает, Но я на 5 млн пробовал. В след месяцах (декабре и мае) могут быть двойные зачисления, тогда не знаю что будет  

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Кнопка цитирования не для ответа

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#18

27.08.2015 15:38:20

Игорь, зря вы так по поводу SQL. Решил, коль целый день делать нечего с имитировать (упрощённо) задачу ТС. Создал два тестовых файла.
1. Users таблица клиентов ([UserName] ФИО — 16 символьное поле; [UserBirthday] Дата ФИО — дата).
2. UserData таблица покупок ([UserName] ФИО — 16 символьное поле; [DateBuy] Дата Покупки — дата; [Ammount] Сумма — плавающее).
Код был следующий

Скрытый текст

В Users 2 000 000 записей, в UserData 15 409 218 (часть записей для 500 000 ФИО отсутствует в Users). Собственно, задача отобрать в UserData ФИО, которых нет в Users (естественно, без повторений, так как в UserData могут быть сведения об нескольких покупках одного ФИО). В коде выше добавлены процедурой AddNotIn в UserData.

Попробовал сделать на словарях, вполне возможно, что допустил какую-то некорректность, код ниже, прошу дать оценку

Скрытый текст

Подождал некоторое время (минут 15) прервал.

Далее, загнал в Access, проиндексировал обе таблицы по полю UserName, далее следующим кодом получил результат за 65 секунд

Скрытый текст

Ну, и тоже самое для этих же данных, помещённых в MS SQL LocalDb (естественно с индексами по UserName) — результат получен за 13 секунд

Скрытый текст

Думаю, для столь объёмных данных выводы очевидны. Не забывайте использовать в базах данных индексы и строить запросы так, чтобы эти индексы задействовались.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Split(pStream.ReadAll, vbCrLf) может быть долго на большом файле, и памяти займёт много. Может лучше читать файл построчно — по времени может чуть дольше (а может и нет), но память должна экономиться.
For i = 1 To UBound(strOut) — там в файле есть строка заголовка?
Ключи можно выгрузить на лист сразу, без допмассива, используя Application.Transpose(notInDict.keys) — если правда Application.Transpose такой объём потянет.

«загнал в Access, проиндексировал обе таблицы по полю UserName» — это время не учитывалось?

Но вообще если SQL отработал намного быстрее — то это отлично. Вариант на словаре вроде оптимально написан, но думаю основное время теряется на чтении файлов в массив, и на этих Left$().
Кстати, где эта процедура в SQL? :)
У словаря есть одно преимущество — там всё понятно что когда и как происходит :)

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#20

27.08.2015 16:39:53

Цитата
Может лучше читать файл построчно — по времени может чуть дольше (а может и нет), но память должна экономиться.

Был и такой вариант — разницы особой не вижу, этот показался, что будет быстрее, по идее в Excel 2010 64bit на ПК с 8Гб памяти поместится должен.

Цитата
For i = 1 To UBound(strOut) — там в файле есть строка заголовка?

Есть, но slit же индексирует начало массива с 0, хотя согласен For i = LBound(strOut) + 1 — правильнее.

Цитата
если правда Application.Transpose такой объём потянет.

Увы, не потянет — результат почти полмиллиона строк.

Цитата
«загнал в Access, проиндексировал обе таблицы по полю UserName» — это время не учитывалось?

Нет, не учитывалось. Я всё пытаюсь довести мысль до tvit, что не логично выгружать данные из базы, чтобы потом кустарным способом делать тоже самое. Правда, не смотря на то, что ТС тут мимо пробегает, что не так и что не устраивает НАГЛО не сообщает. Ни тебе спасибо, ни пожалуйста.

Цитата
Вариант на словаре вроде оптимально написан, но думаю основное время теряется на чтении файлов в массив, и на этих Left$(). Кстати, где эта процедура в SQL?

Так она выполняется утилитой импорта, а как писал выше — это время не учитывалось.

Цитата
У словаря есть одно преимущество — там всё понятно что когда и как происходит

С другой стороны SQL и базы для того разрабатывались, чтобы думать над реализаций логики получения данных в требуемом виде, а не над особенностями хранения и выбора лучшего алгоритма получения (хотя и тут присутствуют варианты и свои рекомендации для более быстрого выполнения);)

P. S. Прогнал ещё на SQLite — 22 секунды — хорош.

Изменено: Андрей VG27.08.2015 17:08:44

 

Smiley

Пользователь

Сообщений: 530
Регистрация: 16.05.2013

Андрей VG, добрый вечер. А можно Вас попросить любопытства ради попробовать вместо DISTINCT группировку? Будет ли быстрее?

ЗЫ: а можно в Access еще проиндексировать много полей, чтобы вообще быстро было :D

Изменено: Smiley27.08.2015 17:11:20

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#22

27.08.2015 18:03:35

Smiley, добрый вечер.
Да почти так же 62 сек. Прогнал и чисто текстовый вариант с написанием schema.ini

Код
.CommandText = "Select Distinct tud.UserName From [data.csv] as tud Left Join [user.csv] as tu On (tud.UserName=tu.UserName) Where tu.UserName Is Null"

вышло 105 секунд.
Индексировать — тоже можно нарваться — не только же выборки есть, но и вставки, обновления, а это всё пересчёт индексов — может и притормозить. Из всех протестированных сегодня баз данных — Access самый тугодумный;)

Изменено: Андрей VG27.08.2015 18:05:37

 

Smiley

Пользователь

Сообщений: 530
Регистрация: 16.05.2013

#23

27.08.2015 19:08:43

Цитата
Андрей VG написал:
Индексировать — тоже можно нарваться — не только же выборки есть, но и вставки, обновления, а это всё пересчёт индексов — может и притормозить

ну я поэтому и поставил смайлик :)

Учусь программировать :)

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

#24

31.08.2015 15:00:09

Реализовал свою идею через Словари. Скорость приемлемая, за исключением последнего шага. В котором я пытаюсь сохранить Словарь в файл. На меленьких файлах скорость приемлемая, но когда размер справочника 4 млн строк, а размер занимаемой памяти Excel около 1 Гб, сохранение идет очень долго — в минуту не более 1000 строк  :

Код
Public Sub ClosePensSprav(FileName As String)
Dim txtFile As TextStream
Dim TmpString As String
Dim Ndx As Long
Dim lLowVal As Long
Dim lHighVal As Long
Dim lStep As Long

    If Not (FSO.FileExists(FileName)) Then FSO.CreateTextFile (FileName)
    Set txtFile = FSO.OpenTextFile(FileName, ForWriting)
    
    lHighVal = PensSprav.Count
    lStep = CLng(lHighVal / 100)
    
    For Ndx = 0 To PensSprav.Count - 1

        lLowVal = Ndx
        If lLowVal Mod lStep = 0 Then Application.StatusBar = "Сохранение справочника:" & FSO.GetFileName(FileName) & ": " & sObrStr(lLowVal, lHighVal) & sSuff(CInt(lLowVal / lHighVal * 100))

        TmpString = PensSprav.Keys(Ndx) & "|" & PensSprav.Items(Ndx)
        txtFile.WriteLine (TmpString)
        DoEvents
    Next Ndx
    
    txtFile.Close
    Application.StatusBar = False
    Set txtFile = Nothing
    Set PensSprav = Nothing

End Sub
 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

Также заметил что размер памяти при закрытии файлов и очистки вспомогательных словарей, уменьшается не сильно. Объем моего справочника 4.5 млн строк в среднем по 45 символов каждая, итого не более 200 Мб, а Эксель занимает около 1 ГБ, не пойму почему

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

Прошу прощения что сразу не отвечал на вопросы. У меня Интернет на отдельной машине. Поэтому форум нет возможности читать регулярно.
На SQL Задача уже реализована давно и работает с очень быстрой скоростью, но мне нужно именно на Excel.  

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Доброе время суток
tvit, а у меня в #22 именно на Excel, с использованием движка от Access. Если Excel 32битный для SQL операций с текстовыми файлами можно задействовать Jet «движок» Access с XP по Win7 штатно стоит в системе (только в этом случае для них лучше прописать schema.ini). Что с 8 и 10 версией не знаю.

P. S. А не поделитесь — сколько времени у вас уходит на поиск отсутствующих?

Изменено: Андрей VG31.08.2015 16:36:39

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

#28

31.08.2015 18:10:09

Цитата
Андрей VG написал:
P. S. А не поделитесь — сколько времени у вас уходит на поиск отсутствующих?

Завтра на работе запущу и отчитаюсь

 

tvit

Пользователь

Сообщений: 60
Регистрация: 01.04.2014

to

Андрей VG

Построчное считывание файла и занесение во временный словарь: 2 476 710 за 5 минут 47 секунд
Обновление пустого справочника 1 390 342 строчек за 4 мин 45 сек

Построчное считывание 2 файла: 2 025 113 за 4 мин 34 сек
Обновление справочника: 1 222 422 строчек за 7:38

При попытке сохранить словарь 2.5 млн строчек в файл, комп умирает. Сохраняется не более 1000 строк в минуту, как бы это ускорить?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#30

01.09.2015 19:30:25

Доброе время суток
Попробуйте открыть текстовый файл справочника на добавление записей, и добавлять только отсутствующие в нём записи, а не создавать его с ноля.

Код
Set txtFile = FSO.OpenTextFile(FileName, ForAppending)

Хотя не понимаю, почему вы не хотите использовать Jet Access Engine?
В заведомо проигрышных условиях. Виртуальная машина Windows 7 32bit  (хостовая машина Windows 7 64bit на ноутбуке с двуядерным Intel i7 2011 года выпуска), установленная на внешний ноутбучный HDD, подключенный через USB2.0. По примеру, исходная структура описанная в #18 (2000000 исходных).  Добавлялось к справочнику пользователей два поля ФИО, ДатаРождения (добавлено 500000 записей). И на таких условиях время выполнения 188 секунд — 3 минуты 8 секунд. Может всё же не городить огород? Не стандартные разделители полей в текстовых файлах легко описываются в schema.ini. Да и весь код был в vbscript.
Вы бы уж описали задачу чуть поподробнее и приложили бы пример файлов.

Изменено: Андрей VG01.09.2015 19:33:26

Виктор Петров

На сайте с 05.01.2020

Offline

240

Дык. Задачи определяют. Где СУБД, где Python, а какой шарлатан и BI какому радый.

NikSolovov

На сайте с 15.12.2019

Offline

51

Виктор Петров #:
Дык. Задачи определяют. Где СУБД, где Python, а какой шарлатан и BI какому радый.

Я в этом деле мало что понимаю)))

Цель: запихнуть 6 миллионов строк в эксель, обычный файловый, не облачная версия. (ну если это возможно)

Алеандр

На сайте с 08.12.2010

Offline

170

NikSolovov #:
запихнуть 6 миллионов строк в эксель

Как обрабатывать потом? У вас не просто домашний комп, а сервер должен быть, чтобы потом в excel переваривать такое количество строк.
А уж про выполнение на нем функций сортировок или еще каких-то действий — вообще под вопросом.

Проще, как выше написали, работать с такими объемами в БД и дополнительным ПО, если потребуется, на мой взгляд excel для таких объемов малопригоден.

D

На сайте с 06.01.2022

Offline

9

Powerquery

NikSolovov

На сайте с 15.12.2019

Offline

51

Алеандр #:

Как обрабатывать потом? У вас не просто домашний комп, а сервер должен быть, чтобы потом в excel переваривать такое количество строк.
А уж про выполнение на нем функций сортировок или еще каких-то действий — вообще под вопросом.

Проще, как выше написали, работать с такими объемами в БД и дополнительным ПО, если потребуется, на мой взгляд excel для таких объемов малопригоден.

У меня комп хороший ryzen 5900 проц оперативки 64. База в миллион летает вроде. 

Цель простая: есть 2 столбика на 6 миллионов строк. 

Через фильтр вбиваю запрос и получаю все данные по этому запросу. 

Сейчас приходится открывать за раз 6 Эксель файлов и делать 6 раз одно и тоже действие. 

А хочется все объеденить и за раз вытаскивать данные. 

AD

На сайте с 05.05.2007

Offline

230

В Notepad  10+ мильонов  строк добавлял, но нужен мощный аппарат.

W1

На сайте с 22.01.2021

Offline

197

Делайте нормальную базу данных и работайте с ней. Excel предназначен для других целей.

BrickLayer

На сайте с 13.06.2020

Offline

72

NikSolovov :

Всем привет я так понял в Excel есть ограничения (не могу добавить в 1 файл больше 1 миллиона строк (ну там миллион с копейками получается).

Сейчас разбил на 6 файлов по 1 миллиону, но это жутко неудобно.

Есть какие-то решения или альтернативы? Спасибо.

Попробуйте OpenOffice он полегче MS Excel и сохраняйте файл в формате CSV.  Должно получиться с очень большой вероятностью.

P.S. CSV это по сути текстовый файл без лишнего мусора и OpenOffice его кушает на раз два. А работать можно со всеми удобствами таблиц Excel.

alaev

На сайте с 18.11.2010

Offline

617

А если так? На php?

Создание и продвижение сайтов — https://alaev.net , аудиты сайтов, контекстная реклама

LEOnidUKG

На сайте с 25.11.2006

Offline

1686

Моя старая инструкция: https://searchengines.guru/ru/forum/877149/page66#comment_15209991

Возможно вам поможет.

Букварикс: бесплатная программа для быстрого подбора ключевых слов - Сервисы и программы для работы с SE - Практические вопросы оптимизации - Форум об интернет-маркетинге - Страница 66

Понравилась статья? Поделить с друзьями:
  • Excel блокируется файл с общим доступом
  • Excel блокировка ячейки при условии
  • Excel блокировка формулы в ячейке
  • Excel блокировка ввода в ячейку
  • Excel блок ячеек это могут быть ячейки