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

Работа с огромными файлами - Delphi

14.03.2017, 13:09. Просмотров 795. Ответов 32
Метки нет (Все метки)

Текстовик примерно размером в 20гб.
При загрузке и поиске файла выскакивает ошибка Out you memory оперативы 16гб как можно обойти?
http://www.cyberforum.ru/delphi-beginners/thread17566.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2017, 13:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с огромными файлами (Delphi):

Работа с файлами
Задали на практике файловый менеджер(на подобии тотал командер) через ListView...

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

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

Работа с файлами
Помогите пожалуйста разобраться не как не получается Сайт который получено...

Работа с файлами
У меня такой вопрос. Можно ли создавать каким-нибудь образом массив файлов. То...

32
Matan!
Delphi/Java/DB Dev + Math
395 / 264 / 112
Регистрация: 31.05.2013
Сообщений: 2,161
Записей в блоге: 4
Завершенные тесты: 2
17.03.2017, 15:10 #21
krapotkin, TStreamReader у меня тоже не читался бы..
VladPik, попробуйте заменить его на TFileStream.

Добавлено через 4 минуты
Поясню для VladPik, чтобы понятнее ему было.
Цитата Сообщение от krapotkin Посмотреть сообщение
while f1.position<f1.size do
это аналог while not EOF(f1) do, только действие происходит для потока, а не для файла. То есть "пока мы находимся внутри потока, выполним..."

Добавлено через 1 минуту
Цитата Сообщение от krapotkin Посмотреть сообщение
Delphi
1
s1:=f1.readLine;
Читаем первую строку потока.

Добавлено через 3 минуты
Цитата Сообщение от krapotkin Посмотреть сообщение
p:=pos(s2,s1);
Позиция строки s2 в s1.

Добавлено через 41 секунду
Цитата Сообщение от "krapotkin;10225322"[DELPHI
]f1.free;
f2.free;[/DELPHI]
Освобождение памяти.
0
VladPik
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 138
17.03.2017, 15:41  [ТС] #22
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sSkinManager, sMemo, sButton, ExtCtrls, sPanel, sLabel;
 
type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    sSkinManager1: TsSkinManager;
    sMemo1: TsMemo;
    sMemo2: TsMemo;
    sPanel1: TsPanel;
    sButton1: TsButton;
    sButton2: TsButton;
    sPanel2: TsPanel;
    sLabel2: TsLabel;
    sLabel1: TsLabel;
    sButton3: TsButton;
    procedure FormShow(Sender: TObject);
    procedure sButton1Click(Sender: TObject);
    procedure sButton2Click(Sender: TObject);
    procedure sButton3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.sButton1Click(Sender: TObject);
var SL: TStringList;
     i, j: integer;
begin
if sMemo2.Text='' then
begin
ShowMessage('Заполните поле ниже!');
exit;
end
else
 if not OpenDialog1.Execute then Exit;
 sMemo1.clear;
 SL:= TStringList.Create;
 SL.LoadFromFile(OpenDialog1.FileName);
 for i:= 0 to sMemo2.Lines.Count-1 do
for j:= 0 to SL.Count - 1 do
if (pos(smemo2.lines[i],  SL.Strings[j]) <> 0) then
sMemo1.Lines.Add(SL.Strings[j]);
sLabel1.Caption := IntToStr(sMemo1.Lines.Count);
sButton2.Enabled:=True;
 SL.Free;
end;
 
 
procedure TForm1.FormShow(Sender: TObject);
begin
sMemo1.clear;
sMemo2.clear;
sMemo1.Enabled:=False;
sButton2.Enabled:=False;
Application.Title:= 'By VladPik';
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
var
  saveDialog : TSaveDialog;
begin
  saveDialog := TSaveDialog.Create(self);
  saveDialog.Title := 'Сохранение работы.';
  saveDialog.InitialDir := GetCurrentDir;
  saveDialog.Filter := 'Text file|*.txt|';
  saveDialog.DefaultExt := 'txt';
  saveDialog.FilterIndex := 1;
  if saveDialog.Execute
  then sMemo1.Lines.SaveToFile(SaveDialog.FileName);
  saveDialog.Free;
end;
 
procedure TForm1.sButton3Click(Sender: TObject);
begin
sMemo1.clear;
sMemo2.clear;
sButton2.Enabled:=False;
slabel1.Caption:='0'
end;
 
end.
я просто оставлю весь код так как мои ручки кривые и я просто весь текст по делфи не могу понять. как тут сделать шоб ошибки не было я не могу понять это наверное весь окд нужно менять
0
krapotkin
3295 / 2935 / 1015
Регистрация: 14.04.2014
Сообщений: 14,256
Записей в блоге: 13
17.03.2017, 17:03 #23
для д7 переписал на кондовом паскале
но т.к. д7 у меня нет, то узнать, как там читается файл UTF8 через ReadLn я не могу
пользуйтесь отладчиком
или вполне можете для начала чем-нибудь сконвертировать файл в win1251
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
procedure TForm1.b1Click(Sender: TObject);
var
  f1, f2: TextFile;
  s1, s2: string;
  p: integer;
  filename1, filename2:string;
begin
  FileName1 := 'bigFile.txt';
  FileName2 := 'littleFile.txt';
  AssignFile(f1, FileName1);
  Reset(f1);
  AssignFile(f2, FileName1);
  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
        // нашли, что строка s2 есть в s1
        // делайте с ней что хотите
      end;
    end;
  end;
  CloseFile(f1);
  CloseFile(f2);
 
end;
1
VladPik
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 138
17.03.2017, 19:03  [ТС] #24
Цитата Сообщение от krapotkin Посмотреть сообщение
для д7 переписал на кондовом паскале
но т.к. д7 у меня нет, то узнать, как там читается файл UTF8 через ReadLn я не могу
пользуйтесь отладчиком
или вполне можете для начала чем-нибудь сконвертировать файл в win1251
все гуд пока я свой код не вставляю.
Цитата Сообщение от krapotkin Посмотреть сообщение
// нашли, что строка s2 есть в s1
* * * * // делайте с ней что хотите
тут должно брать найденные s2 и записывать в memo
сделал так
Delphi
1
sMemo1.Lines.Add(S2.Strings[p]);
дают ошибку
0
krapotkin
3295 / 2935 / 1015
Регистрация: 14.04.2014
Сообщений: 14,256
Записей в блоге: 13
17.03.2017, 20:19 #25
sMemo1.Lines.Add(S2);

Добавлено через 25 секунд
s2 - это строка. Какие в ней еще Strings ??
0
VladPik
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 138
17.03.2017, 22:54  [ТС] #26
Цитата Сообщение от krapotkin Посмотреть сообщение
sMemo1.Lines.Add(S2);
Добавлено через 25 секунд
s2 - это строка. Какие в ней еще Strings ??
Работает но очень криво.
содержание файла bigFile
Кликните здесь для просмотра всего текста

Содержание littleFile
Кликните здесь для просмотра всего текста

0871

На выходе получаю строк больше чем в оригинале

по нескольку раз добавляет в чём может быть проблема?
вот код
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
procedure TForm1.sButton1Click(Sender: TObject);
var
  f1, f2: TextFile;
  s1, s2: string;
  p: integer;
  filename1, filename2:string;
begin
  FileName1 := 'bigFile.txt';
  FileName2 := 'littleFile.txt';
  AssignFile(f1, FileName1);
  Reset(f1);
  AssignFile(f2, FileName1);
  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
sMemo1.Lines.Add(S2);
sLabel1.Caption := IntToStr(sMemo1.Lines.Count);
sButton2.Enabled:=True;
      end;
    end;
  end;
  CloseFile(f1);
  CloseFile(f2);
 
end;
0
Matan!
Delphi/Java/DB Dev + Math
395 / 264 / 112
Регистрация: 31.05.2013
Сообщений: 2,161
Записей в блоге: 4
Завершенные тесты: 2
17.03.2017, 23:02 #27
Цитата Сообщение от VladPik Посмотреть сообщение
по нескольку раз добавляет в чём может быть проблема?
Второй раз
Цитата Сообщение от VladPik Посмотреть сообщение
Reset(f2);
зачем?
0
VladPik
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 138
17.03.2017, 23:16  [ТС] #28
Цитата Сообщение от Matan! Посмотреть сообщение
по нескольку раз добавляет в чём может быть проблема?
Второй раз
Сообщение от VladPik
Reset(f2);
зачем?
ну мне дали такой код без второго раза ошибку даёт при нажатии на кнопку I\O Error 104
0
Matan!
Delphi/Java/DB Dev + Math
395 / 264 / 112
Регистрация: 31.05.2013
Сообщений: 2,161
Записей в блоге: 4
Завершенные тесты: 2
17.03.2017, 23:20 #29
ПОпробуйте вынести это:
Цитата Сообщение от VladPik Посмотреть сообщение
Delphi
1
2
3
4
5
6
if (p > 0) then
begin
sMemo1.Lines.Add(S2);
sLabel1.Caption := IntToStr(sMemo1.Lines.Count);
sButton2.Enabled:=True;
end;
после end от
Delphi
1
while not EOF(f2) do
0
VladPik
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 138
17.03.2017, 23:27  [ТС] #30
Или я что то не понимаю или ты мне дал тот же код вот:
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
procedure TForm1.sButton1Click(Sender: TObject);
var
  f1, f2: TextFile;
  s1, s2: string;
  p: integer;
  filename1, filename2:string;
begin
  sMemo1.clear;
  FileName1 := 'bigFile.txt';
  FileName2 := 'littleFile.txt';
  AssignFile(f1, FileName1);
  Reset(f1);
  AssignFile(f2, FileName1);
  Reset(f2);
  while not Eof(f1) do
  begin
    readLn(f1,s1);
    CloseFile(f2);
    while not EOF(f2) do
    begin
      readLn(f2,s2);
      p := pos(s2, s1);
if (p > 0) then
begin
sMemo1.Lines.Add(S2);
sLabel1.Caption := IntToStr(sMemo1.Lines.Count);
sButton2.Enabled:=True;
end;
    end;
  end;
  CloseFile(f1);
  CloseFile(f2);
 
end;
так же идёт ошибка
0
Matan!
Delphi/Java/DB Dev + Math
395 / 264 / 112
Регистрация: 31.05.2013
Сообщений: 2,161
Записей в блоге: 4
Завершенные тесты: 2
17.03.2017, 23:31 #31
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
procedure TForm1.sButton1Click(Sender: TObject);
var
* f1, f2: TextFile;
* s1, s2: string;
* p: integer;
* filename1, filename2:string;
begin
* sMemo1.clear;
* FileName1 := 'bigFile.txt';
* FileName2 := 'littleFile.txt';
* AssignFile(f1, FileName1);
* Reset(f1);
* AssignFile(f2, FileName1);
* Reset(f2);
* while not Eof(f1) do
* begin
* * readLn(f1,s1);
* * CloseFile(f2);
* * while not EOF(f2) do
* * begin
* * * readLn(f2,s2);
* * * p := pos(s2, s1);
end;
if (p > 0) then
begin
sMemo1.Lines.Add(S2);
sLabel1.Caption := IntToStr(sMemo1.Lines.Count);
sButton2.Enabled:=True;
end;
* * 
* end;
* CloseFile(f1);
* CloseFile(f2);
end;
0
VladPik
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 138
17.03.2017, 23:41  [ТС] #32
та же ошибка на эту строку while not EOF(f2) do
0
krapotkin
3295 / 2935 / 1015
Регистрация: 14.04.2014
Сообщений: 14,256
Записей в блоге: 13
18.03.2017, 09:39 #33
але
CloseFile-ResetFile это способ просто сделать Seek(0) по текстовому файлу
я сразу написал, это решение если второй файл довольно большой, иначе лучше просто закачать его в стринглист

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

кроме того. вы можете ну вообще не понимать, что делает программа.
но, черт побери, возьмите в руки отладчик!!!
и сразу увидите опечатку AssignFile(f2, FileName1);
потому что должно быть AssignFile(f2, FileName2);
Кликните здесь для просмотра всего текста
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
procedure TForm1.b1Click(Sender: TObject);
var
  f1, f2: TextFile;
  s1, s2: string;
  p: integer;
  filename1, filename2:string;
begin
  FileName1 := ExtractFilePath(ParamStr(0))+ '1.txt';
  FileName2 := ExtractFilePath(ParamStr(0))+ '2.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);
 
end;
0
Миниатюры
Работа с огромными файлами  
18.03.2017, 09:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2017, 09:39
Привет! Вот еще темы с решениями:

Работа с файлами
Здравствуйте! Помогите пожалуйста доделать программу... Условие: Вот что...

работа с файлами
var Form1: TForm1; f1: file of word; wr: word; procedure TForm1.basesave;...

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

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


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

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

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