Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Awwent
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 81
#1

Загрузка в StringList больших txt-файлов - Delphi

16.03.2017, 15:23. Просмотров 433. Ответов 15
Метки нет (Все метки)

Обычным опендиалогом загружать в стринглист текстовики 1-N-ое кол-во гб никак.
Ругается на Out of Memory, но при этом на ПК 32гб ОЗУ.
Как можно иначе загружать большие текстовики?
Надо что-бы в программу загружали Строки с данными там например:
Note
Note2
Note3
и т.д
Потом загружали второй текстовик, он должен искать повторяющиеся строки и удалять их и соединять в единое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2017, 15:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Загрузка в StringList больших txt-файлов (Delphi):

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

Загрузка больших текстовых файлов в массив и сверка
Всем привет: Имеем: Два текстовых файла размером примерно по 100MB каждый....

Загрузка из двух файлов txt в один StringGrid1
Здравствуйте, господа программисты! Ни как не могу справиться, помогите...

Загрузка и обработка большого файла в StringList
var t:TextFile ; s:TStringlist ; x:String ; begin if...

Загрузка из файла в stringgrid с использованием stringlist
Код отлично работает в одном приложении, но отказывается работать в другом ...

Сохранение данных с ListView в .txt и загрузка с .txt
Сохранение данных с ListView в .txt и загрузка с .txt Помогите.

15
droider
Universal
Эксперт Pascal/Delphi
4383 / 2431 / 762
Регистрация: 04.10.2012
Сообщений: 8,847
16.03.2017, 16:13 #2
Awwent, так уже вроде была на днях тема. Клонируемся, да?
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
16.03.2017, 17:46 #3
для очень больших файлов ищите другие способы, чем тащить все в рот...
например
http://docwiki.embarcadero.com/Libra...eader.ReadLine
0
Awwent
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 81
16.03.2017, 19:00  [ТС] #4
А как использовать примеры есть?
0
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,588
16.03.2017, 20:36 #5
я загрузал в StringList файл в 2 гига - дальше outofmemory
спасли только Stream'ы

теперь гружу csv файл в 4-5 гигов со скоростью 1000 строк в секунду, далее гружу в MSSQL с проверками

Добавлено через 46 секунд
Awwent, напиши для чего тебе такое и я поделю кодом для обработки (правда у меня csv, но гружу я построчно)
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
16.03.2017, 21:19 #6
я чувствую надо слить темы
Работа с огромными файлами
0
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,588
17.03.2017, 21:43 #7
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
SR : TStreamReader;
 
begin
SR := TStreamReader.Create(filename);
  while not (SR.EndOfStream) do
  begin
    sl.DelimitedText:=SR.ReadLine; // читаю строку в StringList
    for I := 0 to sl.Count-1 do //так как у меня csv, то выставив разделителем ";" я обхожу все что внутри и проверяю
    begin
  
    end;
  end;
SR.Free;
end;
пробовал через StringList - дохнет на 4гб файлах
пробовал другие потомки TStream - некоторые очень быстрые, но как только нужно разбить файл по строкам - все упирается в работу с буфером и скорость равняется с TStreamReader.
в 10.1 вроде было написано что придумали TStreamBuffer или что-то такое - не пробовал

У меня сейчас с проверками получается 1000 строку в секунду
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
17.03.2017, 21:48 #8
не 1000, а 1000 * на число строк из файла 2

вообще работа со строками упирается исключительно в поиск разделителя строки в буфере, для этого приходится искать перебором, вот и предел скорости
остальное - просто подгрузка данных в этот буфер
0
Awwent
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 81
19.03.2017, 02:06  [ТС] #9
Цитата Сообщение от krapotkin Посмотреть сообщение
я чувствую надо слить темы
Работа с огромными файлами
Проблема в том, что виснет после пару проверенных строк.
А в потоке лажа получается. Ошибочки там и некорректная работа
0
northener
пофигист широкого профиля
3251 / 2303 / 628
Регистрация: 15.07.2013
Сообщений: 13,585
19.03.2017, 02:21 #10
Цитата Сообщение от Awwent Посмотреть сообщение
А в потоке лажа получается
Естественно. Тем более что потоки тут ничем помочь не могут.
0
Awwent
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 81
19.03.2017, 02:53  [ТС] #11
Цитата Сообщение от northener Посмотреть сообщение
Естественно. Тем более что потоки тут ничем помочь не могут.
Ну, а как в форме сделать так, что-бы софт не виснул?
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
19.03.2017, 05:56 #12
Капитан: "Нужно исправить код!"

Добавлено через 2 минуты
потоки могут помочь только если предварительно разбить большие данные на N кусков и каждому из потоков дать искать в своем куске
тогда они будут действовать параллельно
но потоков все равно должно быть не более 2 на ядро
0
Awwent
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 81
19.03.2017, 14:23  [ТС] #13
Цитата Сообщение от krapotkin Посмотреть сообщение
Капитан: "Нужно исправить код!"
m1.Clear;
FileName1 := ExtractFilePath(ParamStr(0)) + BigBaseText.Text + '.txt';
FileName2 := ExtractFilePath(ParamStr(0)) + smallText.Text + '.txt';
AssignFile(f1, FileName1);
Reset(f1);
AssignFile(f2, FileName2);
Reset(f2);
while not Eof(f1) do
begin
readLn(f1, s1);
CloseFile(f2);
Reset(f2);
while not EOF(f2) do
begin
readLn(f2, s2);
p := pos(s2, s1);
if (p > 0) then
begin
m1.Lines.Add(s2 + ' : ' + s1);
end;
end;
end;
CloseFile(f1);
CloseFile(f2);
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
19.03.2017, 14:44 #14
почему у меня не виснет?
0
Awwent
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 81
19.03.2017, 14:48  [ТС] #15
Цитата Сообщение от krapotkin Посмотреть сообщение
почему у меня не виснет?
Вот..
0
Миниатюры
Загрузка в StringList больших txt-файлов  
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
19.03.2017, 17:16 #16
ну так может работает оно
у вас же цикл
полный перебор каждый с каждым
это много

отладчик-то для чего? поставьте точку останова, оно и покажет
0
19.03.2017, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2017, 17:16
Привет! Вот еще темы с решениями:

Загрузка файла *.txt при открытии приложения при двойном клике на самом файле *.txt
Здравствуйте! Подскажите как сделать так, чтобы при двойном клике по текстовому...

Найти дробные значения y(x) и g(x) из файлов Y.DAT.txt и G.DAT.txt

Загрузка из txt в StringGrid таблицу
Помогите не могу так понять как загрузить из текстового документа в StringGrid...

Сравнение больших файлов
Даются два XLS(CSV) файла, требуется из 1 файла вытащить из поля N - номера...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru