Страница 1 из 2
не могу записать в базу данных 4 Гб информации
Добавлено: 18 май 2005, 11:19
Михалыч
Всем добрый день.
Прошу помочь справить с такой проблемой. С IB раньше серьезно не работал. Мне необходимо из текстового ascii файла размером 4 Гб записать в таблицу БД IB 7.1 текстовую и числовую (целые и вещественные 12-ти разрядные числа) информацию, а так же даты. Всего в файле порядка 40 млн строк. Писал программу на Delphi и на Borland c++ Builder. Проблема одна и тажа: обрабатывается (и записывается в БД) порядка 2,5 млн строк и выводится ошибка. В Delphi: Invalid pointer operation, в c++: internal gds software consistency chec (can't continue after bugcheck).
Вот кусок программы на с++, на всякий случай:
MainForm->IBDatabase1->LoginPrompt=False;
MainForm->IBDatabase1->DatabaseName = DbEdit->Text;
MainForm->IBDatabase1->Open();
if (MainForm->IBDatabase1->Connected==False)
{
ShowMessage("Error connection to IB database!");
return;
};
...
//здесь происходит открытие текстового файла с данными через fopen
s = "insert into vrslracc (INSNMB, DPTCOD, DCINMB, DCIDCK, DCICPY, PFTTYP, CTMCOD, ENTNMB, CCRCOD, PFTSUM, PFTSUM_EME, PFTSUM_EMR, PFTAGR, PFSNMB, CSTCOD, PFSSUM, PFSTOT) values (";
// в переменной S текст запроса
....
count_rec = 0;
IBTransaction1->StartTransaction();
while (fgets(str,1000,stream))
{
...
query = s + str; // в query типа ansistring собирается текст запроса плюс данные. Типы данных точно соотвествуют требуемым в базе.
query = query + ")";
MainForm->IBQuery1->SQL->Clear();
MainForm->IBQuery1->SQL->Text = query;
try
{
MainForm->IBQuery1->Prepare();
if (MainForm->IBQuery1->Prepared==False)
{
ShowMessage("Query not prepared!");
} else
{
MainForm->IBQuery1->ExecSQL();
};
}
catch(Exception &Err)
{
fputs(query.c_str(),out);
fputc('\n',out);
fflush(out);
};
if ((count_rec % 10000) == 0)
{
IBTransaction1->Commit();
IBTransaction1->StartTransaction();
};
count_rec +=1;
}
IBTransaction1->Commit();
Интересна деталь. Я разрезал исходный текстовый файл на куски по 2 млн строк. Обработал первый из них. Через IBConsolе проверил количество записанных строк в таблицу. Все прошло нормально. Обработал еще два куска. Зашел в IBConsolе и на select count(*) from ... получил сообщение:
Error at line 1 - database file appears corrupt() wrohg page type
page 83684 is of wrong type (expected 5, found 0)Я попробовал Volidation БД, получил сообщение:
Summary of validation errors
Number of data page errors : 3
Number of index page errors : 558
Number of database page errors : 4
Check the InterBase.Log file for additional information
В InterBase.Log примерно вот что:
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Index 1 is corrupt on page 38345 in table VRSLRACC (138)
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Page 53574 wrong type (expected 7 encountered 0)
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Index 1 is corrupt on page 53574 in table VRSLRACC (138)
Не знаю с какой стороны подойти к решению проблемы. Думаю, может надо как-то IB настроить?
IB сервер и клиент находятся на одном компьютере. Пробовал разные файлы gds32.dll в winnt\system32 записывать.
Раньше делал нечто подобное, но с удаленной БД. Такой ошибки не было. Но после этого и на сервере систему сносили и исходный файл поменялся.
И еще: БД состоит из 8 файлов по 480,000 страниц. Размер страницы 4096, пробовали 8192 - не помогло.
Добавлено: 18 май 2005, 11:40
kdv
1. IB 7.1 должен быть SP2. версия 7.1.0.189
2. уже давно, тем более для IB 7.1, нет необходимости делать многофайловую БД
3. какая файловая система используется там, где лежит БД?
4. каков суммарный размер файлов БД при возникновении ошибки?
Добавлено: 18 май 2005, 16:12
Михалыч
kdv писал(а):1. IB 7.1 должен быть SP2. версия 7.1.0.189
2. уже давно, тем более для IB 7.1, нет необходимости делать многофайловую БД
3. какая файловая система используется там, где лежит БД?
4. каков суммарный размер файлов БД при возникновении ошибки?
1. У меня IB вроде бы без SP. В свойствах IB Server про версию написано только:
WI-V7.1.0.189. Это значит, что без SP? Или уже с ним? Можно ли SP где-нибудь скачать download?
2. Я БД делаю для программы, которая будет работать на ОС Windows 98 c FAT32 (у некоторых пользователей локально , у некоторых - удаленно).
3.Сейчас я работаю в
Windows XP Professional v.2002 SP2, БД находится на диске с
NTFS. У меня
512Mb ОЗУ.
4. Сумарный размер файлов БД 685,891,584 byte (по показаниям FarManager-a).
PS: сейчас использую только вариант программы на
c++.
Добавлено: 18 май 2005, 16:25
kdv
1. У меня IB вроде бы без SP. В свойствах IB Server про версию написано только: WI-V7.1.0.189. Это значит, что без SP? Или уже с ним? Можно ли SP где-нибудь скачать download?
ух-ох, я же написал версию IB 7.1 SP2. Это ОНО. Нигде ничего качать не надо. Триал на сайте и последние поставки - только IB 7.1 SP2.
2. Я БД делаю для программы, которая будет работать на ОС Windows 98 c FAT32 (у некоторых пользователей локально , у некоторых - удаленно).
это техзадание такое? 4-гиговые базы на Win98 на FAT32? Однозначно в сад... Даже в случае многофайловой БД. Win98 - только клиент. В остальных случаях использования 95-98 как сервера - welcome в наш платный ремонт БД.
685 мегабайт - не так уж и много. мне кажется, у вас там какая-то кривизна с многофайловостью, хотя повреждения лог показывает задолго до окончания первого файла. уберите многофайловость....
p.s. с++, delphi - никакого значения не имеет.
prepare для статического запроса смысла не имеет. можно убрать.
Добавлено: 19 май 2005, 09:48
Михалыч
1. 4-гиговые базы на Win98 на FAT32? Однозначно в сад... Даже в случае многофайловой БД. Win98 - только клиент.
А что, сделав многофайловую БД, я не избегаю этого ограничения FAT32 ?
2. у вас там какая-то кривизна с многофайловостью
Может ли быть это вызвано не правильными настройками IB ? Размеры страниц, кеша или еще чего-нибудь...
Добавлено: 19 май 2005, 10:08
kdv
А что, сделав многофайловую БД, я не избегаю этого ограничения FAT32 ?
Михалыч, ну какой нафиг СЕРВЕР на WIN98. Окстись. Это же сугубо клиентская операционка. глючная. Да и на ней даже в 300 мег база может тормозить. А если она брякнется, то и потащит за собой базу. При чем тут fat32???
Может ли быть это вызвано не правильными настройками IB ? Размеры страниц, кеша или еще чего-нибудь...
вообще то, "еще чего нибудь" больше и нет, а потом, настройки, какие бы они ни были хреновые, никак не могут (или не должны) приводить к ПОВРЕЖДЕНИЮ БД.
Добавлено: 19 май 2005, 21:31
kdv
ну и как там дела? Попробуй случайные данные залить в том же объеме, мало ли что. Если и с этим будут проблемы - давай приложние и пустую базу. Если ты в Москве, можешь вообще притащить исходный файл импорта ...
Добавлено: 19 май 2005, 21:52
Merlin
Кстати о птичках. Мысля навеяна вопросом про ibrelink в другой нитке и тем, что Михалыч с IB раньше серьёзно не работал. Начинающие частенько наступают на следующие грабли с многофайловыми базами: если её скопировать (именно скопировать, а не b/r) в другой путь на компьютер, где такой базы нет, то соединиться не получится, не будут найдены вторичные файлы. А вот если в другой путь на том же компе и соединиться - то звездец обоим базам, и копии и исходной. Сервер будет работать с первичным файлом копии и вторичными исходной, что из этого выйдет объяснять наверное не надо. И повреждения да, как раз такого типа и получаются - страницы не ожидаемой системы, неправильная длина записи и т.п. А ещё были одно время какие-то глюки с наращиванием количества файлов через Alter Database. Потом вроде поправили, но если там обсчитаться с количеством страниц и начать вторичный файл с уже существующей страницы, то всё равно база билась. Самый надёжный путь - рестором. Ну и конечно же
для многофайловых баз правило НИКОГДА НЕ РЕСТОРИТЬ ОВЕРВРАЙТОМ просто вопрос жизни и смерти.
Добавлено: 20 май 2005, 13:20
Михалыч
1. ну и как там дела?
а воз и ныне там ...(с) И.А.Крылов
дело в том, что БД и исходные данные мне предоставлены другим человеком...
Прочитал пост от Мерлина. Сам создал БД (размер страницы 4094) и таблицу в ней. Опять запустил эту программу - загрузил 1 файл (из 2 млн. строк), начал загружать второй файл и ... на 1,790,000 строке опять это
"internal gds software consistency chec (can't continue after bugcheck)".
Таблицу в БД создал в Interactiv SQL так:
CREATE TABLE VRSLRACC (INSNMB INTEGER NOT NULL,
DPTCOD INTEGER,
DCINMB FLOAT,
DCIDCK SMALLINT,
DCICPY SMALLINT,
PFTTYP CHAR(4) CHARACTER SET WIN1251,
CTMCOD CHAR(4) CHARACTER SET WIN1251,
CTMSHT CHAR(20) CHARACTER SET WIN1251,
ENTNMB DECIMAL(12, 0),
CPREXT CHAR(4) CHARACTER SET WIN1251,
CCRCOD CHAR(4) CHARACTER SET WIN1251,
PFTSUM FLOAT,
PFTSUM_EME FLOAT,
PFTSUM_EMR FLOAT,
PFTAGR CHAR(4) CHARACTER SET WIN1251,
PFSNMB SMALLINT NOT NULL,
CTMBEG TIMESTAMP,
CTMEND TIMESTAMP,
CSTCOD CHAR(4) CHARACTER SET WIN1251 NOT NULL,
PFSSUM FLOAT,
PFSTOT CHAR(4) CHARACTER SET WIN1251);
CREATE DESCENDING INDEX INSNMB_VRSLR ON VRSLRACC(INSNMB);
Может тут где ошибка?
И эта БД уже однофайловая? Или как?
т.о. в этот раз в БД загрузилось 3,790,000 строк ( в прошлый раз было 2,970,000)...

Добавлено: 20 май 2005, 13:44
kdv
структура, конечно, интересная, особенно куча float-ов. это научные данные?
И эта БД уже однофайловая? Или как?
гм.... ну если ты к этой БД файлы не добавлял, то однофайловая... Что за вопрос? Многофайловую БД делают явно, указывая сколько и каких файлов надо. Это просто сегментированный файл БД.
т.о. в этот раз в БД загрузилось 3,790,000 строк ( в прошлый раз было 2,970,000)...
интересная ошибка. так что там с передачей данных очно? кажется мне, что иначе этот вопрос решить будет невозможно.
Добавлено: 20 май 2005, 15:13
Михалыч
так что там с передачей данных очно?
к сожалению я из далекого Саратова, так что...
Но дело не в самих данных - это точно, т.к. в прошлый раз я обрабатывал файлы в порядку: f1, f2, f3, а на этот раз я обработал f2, а затем стал грузить f1 (извеняюсь, что пропустил эту немаловажную деталь). Каждый файл грузиться. Поодиночке. Но не вместе
Логика мне подсказывает, что это не в программе и не в данных дело. Все же я грешу на IB. Он у меня, ясное дело, с рынка, может "что-то" там не "то"? Или это руки у меня излишне кривые...
И еще: может подскажет кто, где можно скачать русскоязычную доку по IB?
Добавлено: 20 май 2005, 15:20
Михалыч
особенно куча float
а это играет какую-нибудь роль?
Дело в том, что я сейчас только одну таблицу в БД объявил (для чистоты эксперемента). А на самом деле их там несколько. В одной из них float-ов раза в 3 больше. Но там файл с исходными данными меньше - загрузился без проблем.
Добавлено: 20 май 2005, 15:43
kdv
float-ы играют другую роль. они всего 7-цифр длиной, и дают высокую погрешность при хранении чисел

Добавлено: 20 май 2005, 15:53
Михалыч
kdv писал(а):float-ы дают высокую погрешность при хранении чисел

если мне надо хранить информацию о денежной сумме в пределах 99,999 руб 99 коп - всего два знака точность нужна. Float подойдет? Эти числа будут просто отображаться на экране и не будут принимать участия в расчетах.
Но все же меня больше интересует ответ на пост про файлы и IB...
Добавлено: 20 май 2005, 15:56
kdv
к сожалению я из далекого Саратова, так что...
ну, не такой уж он и далекий. можно было бы через знакомых диск передать.
Логика мне подсказывает, что это не в программе и не в данных дело. Все же я грешу на IB.
да, есть такие подозрения. Если бы не одно но. Например, у одной фирмы есть таблица, в которой 10 миллионов записей, и средний размер записи 211 байт. 330970 страниц, 2.5 гига. Все ОК. Ну и, таких примеров я еще могу наколупать. Поэтому здесь скорее всего есть какая-то специфика, возможно уникальная.
насчет "с рынка" - вопрос этот уже навяз в зубах. Нет денег - используй бесплатное. Кто на платный сервер тебя тащит? Или все-таки предполагается платить за лицензии?
И еще: может подскажет кто, где можно скачать русскоязычную доку по IB?
а нет такой. Все бы вам халявы. Все что есть - указано на сайте
www.ibase.ru.
Доку пытались переводить
www.interbase-world.com, но это благое начинание заглохло уже давно.
Добавлено: 20 май 2005, 17:39
hvlad
"internal gds software consistency chec (can't continue after bugcheck)" всегда возникает после багчека. Т.е. перед этой ошибкой была ещё одна.
Если до программы она не доходит, то в логе сервера она должна быть.
Добавлено: 23 май 2005, 10:58
Михалыч
Добрый день.
hvlad писал(а):"internal gds software consistency chec (can't continue after bugcheck)" всегда возникает после багчека. Т.е. перед этой ошибкой была ещё одна.
Если до программы она не доходит, то в логе сервера она должна быть.
я это на локале (у себя на компе) делаю.
вот строчки из interbase.log за тот день
DMITRII (Server) Fri May 20 08:57:00 2005
Server: setting SWEEP_QUANTUM to 250, USER_QUANTUM to 1000, SWEEP_YIELD_TIME to 1 ms
and MAX_THREADS to 1000000
DMITRII (Client) Fri May 20 08:57:00 2005
Guardian starting: C:\Program Files\Borland\InterBase\bin\ibserver.exe
DMITRII (Server) Fri May 20 11:51:48 2005
Server: setting SWEEP_QUANTUM to 250, USER_QUANTUM to 1000, SWEEP_YIELD_TIME to 1 ms
and MAX_THREADS to 1000000
DMITRII (Client) Fri May 20 11:51:48 2005
Guardian starting: C:\Program Files\Borland\InterBase\bin\ibserver.exe
DMITRII (Server) Fri May 20 12:50:50 2005
Database: D:\PERS\PERSON.GDB
database file appears corrupt ()
wrong page type
page 94853 is of wrong type (expected 7, found -1)
internal gds software consistency check (error during savepoint backout (290), file: exe.c line: 1792)
Что бы это значило?
Добавлено: 23 май 2005, 11:12
kdv
DMITRII (Server) Fri May 20 12:50:50 2005
Database: D:\PERS\PERSON.GDB
database file appears corrupt ()
wrong page type
page 94853 is of wrong type (expected 7, found -1)
internal gds software consistency check (error during savepoint backout (290), file: exe.c line: 1792)
сначала не то написал. вот это и есть ошибка
page 94853 is of wrong type (expected 7, found -1)
повредился индекс. почему - неясно. В общем, для воспроизведения надо
1. пустую базу или скрипт с этой таблицей
2. приложение, которое наливает в эту таблицу случайные данные.
Добавлено: 23 май 2005, 11:57
Михалыч
1. пустую базу или скрипт с этой таблицей
скрипт таблицы я уже приводил (см. ниже)
2. приложение, которое наливает в эту таблицу случайные данные.
т.е. - тебе передать? каким образом можно это сделать? ехе-шник всего 97 Kb весит (для запуска необходимы будут некоторые *.bpl и *.dll из Borland c++ 6.0)
Добавлено: 23 май 2005, 12:02
kdv
скрипт таблицы я уже приводил (см. ниже)
выше

. размер страницы и ODS у базы какой?
т.е. - тебе передать? каким образом можно это сделать? ехе-шник всего 97 Kb весит (для запуска необходимы будут некоторые *.bpl и *.dll из Borland c++ 6.0)
нет уж. сделай чистый пример, по минимуму, пожалуйста. без всяких bpl и проч.