Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
1

Загрузка и обработка большого файла в StringList

14.05.2015, 00:26. Показов 7933. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
  t:TextFile ;
  s:TStringlist ;
  x:String ;
begin
if sOpenDialog1.Execute then
  begin
  s:=TStringlist.Create;
  AssignFile(t,sOpenDialog1.FileName);
  Reset(t);
  while not eof(t) do
  begin
    Readln(t,x);
    s.Add(x) ;
  end;
  CloseFile(t);
  showmessage(inttostr(s.Count)) ;
  FreeAndNil(s) ;
  end;
Загружаю файл в 700 мб и через некоторое время загрузки в оперативную память получаю ошибку:
out of memory

Загрузка и обработка большого файла в StringList


Можно ли побороть ошибку и загружать большие файлы с помощью стринглиста, и пользоваться ими во время работы программы?

Использую стринглист, потому он очень быстро обрабатывает строки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 00:26
Ответы с готовыми решениями:

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

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

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

Обработка большого файла
Приветствую. Есть таблица вида: id | field1 | field2 | field3 | field4 | field5 | field6 |...

43
Заблокирован
14.05.2015, 01:32 2
выкинь:
  • TextFile
  • AssignFile
  • Reset
  • Readln
  • CloseFile
юзай s.LoadFromFile()
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 01:39  [ТС] 3
Ага, именно так раньше я и загружал файлы в стринглист.
P.S. Out Of Memory

Код в шапке - загружает больше, чем процедура loadfromfile.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
14.05.2015, 02:12 4
В топике было сказано "Загрузка и обработка".
А в примере кода показана только загрузка. Где код обработки?
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 02:15  [ТС] 5
Допустим, копирование из стринглиста строки по индексу и обработка в потоке построчно (копирование, удаление и прочее (парсинг)).
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
14.05.2015, 02:23 6
Цитата Сообщение от egorea1999 Посмотреть сообщение
Допустим
Любой неграмотный код может вызвать EOutOfMemory. Так почему проблема ищется именно в загрузке файла в StringList?
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 02:26  [ТС] 7
Потому что он удобен для работы со строками.

Есть варианты получше?
0
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 515
14.05.2015, 02:31 8
В потоке (TThread) подгружать в TStringList кусками файл через TFileStream и обрабатывать его, результат выводить в TStringList или компонент весь или блочно в зависимости от объёма данных.
По поводу обработки то - алгоритм Бойера-Мура
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 02:33  [ТС] 9
И чего, не лопнет стринглист? Больше 2-ух гигов загрузит? У меня больше ~1.5 *гига не грузит вообще.

*пардон, 700мб
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
14.05.2015, 02:40 10
Цитата Сообщение от egorea1999 Посмотреть сообщение
Потому что он удобен для работы со строками
Я не спрашивал почему работаешь с ТStringList. Я спрашивал почему ты считаешь что проблема именно в загрузке большого файла, а не в неграмотной обработке его загруженного содержимого?
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 02:43  [ТС] 11
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
s:tstringlist;
 
procedure load;
begin
s:=tstringlist.create;
s.loadfromfile(opendialog.filename);/// 700мб out of memory
show;
end;
 
procedure show;
begin
showmessage(s[0]);
end;
Ну и что теперь?
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
14.05.2015, 02:58 12
Цитата Сообщение от egorea1999 Посмотреть сообщение
Ну и что теперь?
Ну во-первых приведи код, который реально компилируется. Тогда поговорим.
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 03:22  [ТС] 13
Главный мой вопрос темы состоит в том: "Можно ли загрузить в стринглист файл больше 700 мб или нет?"
Придётся через поток кусками загружать в стринглист строки, а вопрос: "Надо ли? Реально ли 2 гига стринглист потянет, если, допустим у тебя 16 гб ОЗУ.".
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 03:36  [ТС] 14
Цитата Сообщение от northener Посмотреть сообщение
А мне это надо?
Я что должен создавать проект и писать его код?
Ну и кто из нас клоун?
А...типа...для того, чтобы был дан ответ обязательно должен прилагаться исходник?

А ну...хорошо, вот:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    btn1: TButton;
    dlgOpen1: TOpenDialog;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  s:TStringList;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btn1Click(Sender: TObject);
begin
dlgOpen1.FileName:='';
if dlgOpen1.Execute then
begin
s:=TStringList.Create;
s.LoadFromFile(dlgOpen1.FileName);
ShowMessage(IntToStr(s.Count));
s.free;
end;
end;
 
end.
У МИНЯ НИ ПАЛУЧАИЦА ЗАГРУЗИТЬ ФАЕЛ БОЛЬШЫ 700 МЕГАБАЙТ, ЧТО МНЕ ДЕЛАТЬ???

P.S. Руки не отсохли?
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
14.05.2015, 07:34 15
если память мне не изменяет, загрузка через StringList N мегабайт приведет к расходу памяти 2N
кто может заранее сказать, хватит тебе ее или нет? проверить - 10 минут вместе с генерацией мега - файла.

с моей т.з. если тебе нужно почистить от снега двор на даче - бери лопату, если взлетную полосу - ищи другое решение
у меня есть приложение, в нем в реальном времени ездит по карте весь электротранспорт 1.5 миллионного города с расписаниями, маршрутной сеткой и массой других штук
и оно все укладывается в 400 мб в памяти
Так что строку в 700 мб ты если только придумал сам.

Как обычно, вопрос задан не о том. http://www.gunsmoker.ru/2008/10/x-y-z.html
Поэтому и ответ - не нужно помогать делать так, как не нужно делать.
Если бы знали исходную задачу, помогли бы...
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 07:57  [ТС] 16
Цитата Сообщение от krapotkin Посмотреть сообщение
если память мне не изменяет, загрузка через StringList N мегабайт приведет к расходу памяти 2N
кто может заранее сказать, хватит тебе ее или нет? проверить - 10 минут вместе с генерацией мега - файла.
Пробовал - вылетело out memory на 1800 mb, странно, но у меня ОЗУ больше, чем 1800 mb.


Думаю, можно в процессе работы записывать в Стринглист по 200 мб за раз, сохранять конечную позицую FileStream'a, обрабатывать их, очищать, затем снова продолжить с конечной позиции, и так до самого конца, у меня выйдет что-то, если попробую так?
0
Заблокирован
14.05.2015, 09:41 17
Дай файл. Просто дай файл и всё. Именно тот самый файл, который хочешь грузить в память.
0
251 / 162 / 24
Регистрация: 22.08.2014
Сообщений: 1,598
Записей в блоге: 1
14.05.2015, 10:58 18
У тебя 4 Га памяти? Тогда больше ты не загрузишь, судя по фотке.
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 34
14.05.2015, 14:26  [ТС] 19
Цитата Сообщение от planetoxod Посмотреть сообщение
У тебя 4 Га памяти? Тогда больше ты не загрузишь, судя по фотке.
8 гигов.

вот 32 гига, результат тот же.
Миниатюры
Загрузка и обработка большого файла в StringList  
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
14.05.2015, 14:51 20
как может 32 бит программа откусить более 3гб?
надо помнить, что в данном случае нужно не суммарная свободная память, а непрерывный кусок памяти такого размера
2
14.05.2015, 14:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 14:51
Помогаю со студенческими работами здесь

Обработка большого файла
Здравствуйте всем, я снова с вопросами , по поводу одной задачи, которую я себе сам придумал на...

Обработка большого файла в потоках
Вот до чего я "дошел" в третьей часу ночи. В рамках самостоятельного изучения криптограифии...

Обработка большого текстового файла
Всем привет. Имеется txt файл размером 16ГБ. Как его обработать по блокам? Допустим по 100к строк.

Обработка большого текстового файла
Добрый день уважаемые программисты. У меня вопрос по поводу размеров) Есть программа парсер хтмл...

обработка большого файла excel
здравствуйте мне нужно парсить excel файл. в нём около 160 000 строк. делаю с помощью PHPExcel...

Загрузка файла большого размера с одного устройства
Здравствуйте! Сейчас делаю сайт и передо мной стоит задача - позволить зарегистрированному...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru