:: Архив конференции по VFP до 2005 года
Как лучше работать с таблицами вышедшими за пределы 2Гб?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Как быть? Таблица выходит за пределы 2Гб, а сокращать не хочется. Наверное нужно ставить флажок на размер и по исчерпании 2Гб создавать новую? Подскажите пожалуйста как это делать, а то у меня тут такое:

http://www.rusl.ru/img/fox-screen13.gif
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
Alex Roublev

Сообщений: 3695
Откуда: Ярославль
Дата регистрации: 28.09.2002
Не мучь животное (в смысле - фоксу). Посчитай размер одной записи в байтах. Определи сколько максимально записей можно сделать. При исчерпании лимита записей заводи автоматизированно новую таблицу.

Цитата:
Наверное нужно ставить флажок на размер

Это какой такой флажок? В VFP нет никаких (таких!) флажков, с помощью которых можно было бы задавать и изменять размер размер рабочей таблицы. Это не MS SQL 2000 Server. Кстати, а ежели количество записей нарастает с такой быстротой, то может быть задачу реализовывать на основе SQL Server'а? Там все-таки таблицы м.б. по 4Гб. Но если и этого не хватит, то впору осмыслить логику самой задачи.



Отредактировано (14.03.05 04:55)


------------------
И волки сыты, и овцы целы, и пастуху - вечная память...
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Если кратко, то таблица получается так.
Берутся текстовые файлы (примерно тыс.5), разбиваются на слова и записываются в таблицу TABLE (DataTable) (FileNameID I, SubWord C(50), Frequency N(12,10))
FileNameID - ID файла
SubWord - слово
Frequency - его частота

Может такой размер из-за 50 символов зарезервированных под размер слова?
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Давай считать

FileNameID I - 8 байт
SubWord C(50) - 50 шт
Frequency N(12,10) - по максимуму 20 байт
Deleted - 1 байт

итого 79 байт на запись, 2Г/79 = 25 млн записей - твой предел в таблице, те в 5 тыс файлов по 5тыс слов.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Посчитал кол-во записей: 32051988



Отредактировано (14.03.05 18:10)


------------------
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
Alex Roublev

Сообщений: 3695
Откуда: Ярославль
Дата регистрации: 28.09.2002
Цитата:
Может такой размер из-за 50 символов зарезервированных под размер слова?

Да уж. Можно представить себе сколько пустого пространства пропадает. Вот тебе и 2 Гб. "Вот те, бабушка, и Юрьев день..."

А если, к примеру, вставлятьслова в memo-поле? Должно быть выйдет компактнее в несколько раз. А слова вставляются в поле без учета уникальности? Слов столько, сколько их существует в 5 тыс. файлов? В орфографическом словаре русского языка ведь не наберется столько...

Вобщем проблему осознаю. Что-нибудь придумаю.
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
Alex Roublev

Сообщений: 3695
Откуда: Ярославль
Дата регистрации: 28.09.2002
*
* TBL - КУРСОР С MEMO-ПОЛЕМ, КУДА ВСТАВЛЯЕТСЯ СОДЕРЖИМОЕ ТЕКСТОВЫХ ФАЙЛОВ
* TMP - КУРСОР, КУДА ЗАПИСЫВАЮТСЯ ОТДЕЛЬНЫЕ СЛОВОФОРМЫ С УЧЕТОМ УНИКАЛЬНОСТИ
* KOL - КУРСОР, ГДЕ ПРЕДСТАВЛЕНЫ КАК СЛОВОФОРМЫ, ТАК И ИХ КОЛИЧЕСТВО
* C:\TEMP - ДИРЕКТОРИЯ, ГДЕ СЛОЖЕНЫ ВОЕДИНО 5 ТЫС. ТЕКСТОВЫХ ФАЙЛОВ
*
LOCAL WRD, DEF_DIR, FLN, LN
STORE "" TO WRD, DEF_DIR, FLN
LN = 0
* ПИШЕМ СОДЕРЖИМОЕ ТЕКСТОВЫХ ФАЙЛОВ В MEMO-ПОЛЕ КУРСОРА
DEF_DIR = SET("DEFAULT")
SET DEFAULT TO ("C:\TEMP\")
ADIR(DIR,"*.TXT")
LN = ALEN(DIR,1)
CREATE CURSOR TBL (MEMO_POLE M NOCPTRANS)
IF LN > 0
FOR I = 1 TO LN
WAIT WINDOW ALLTRIM(STR(I))+"/"+ALLTRIM(STR(LN)) NOWAIT NOCLEAR
FLN = FILETOSTR(DIR(I,1))
INSERT INTO TBL VALUES(FLN)
NEXT
ELSE
RETURN
ENDIF
* ИЩЕМ СЛОВОФОРМЫ И ПОМЕЩАЕМ ИХ В ОТДЕЛЬНЫЙ КУРСОР TMP
CREATE CURSOR KOL (WORDS C(50) NOCPTRANS, WRD_KOL N(10,0))
CREATE CURSOR TMP (WORDS C(50) NOCPTRANS)
INDEX ON WORDS TAG WRD
SELECT TBL
SCAN ALL
WAIT WINDOW ALLTRIM(STR(RECNO("TBL")))+"/"+ALLTRIM(STR(RECCOUNT("TBL"))) NOWAIT NOCLEAR
FOR I = 1 TO GETWORDCOUNT(TBL.MEMO_POLE,CHR(32)) && РАЗДЕЛИТЕЛЬ - ПРОБЕЛ
WRD = ALLTRIM(GETWORDNUM(TBL.MEMO_POLE,I,CHR(32)))
IF !INDEXSEEK(WRD,.F.,"TMP","WRD")
IF !EMPTY(WRD)
INSERT INTO TMP VALUES(WRD)
ENDIF
ENDIF
NEXT
ENDSCAN
* ПОДСЧИТЫВАЕМ КОЛИЧЕСТВО ОТДЕЛЬНЫХ СЛОВОФОРМ ПРИ ПОМОЩИ МАССИВА WKOL
SELECT TMP
SCAN ALL
WAIT WINDOW ALLTRIM(STR(RECNO("TMP")))+"/"+ALLTRIM(STR(RECCOUNT("TMP"))) NOWAIT NOCLEAR
SELECT OCCURS(ALLTRIM(TMP.WORDS),TBL.MEMO_POLE) FROM TBL INTO ARRAY WKOL
INSERT INTO KOL(WORDS,WRD_KOL) VALUES(TMP.WORDS,WKOL)
ENDSCAN
SET DEFAULT TO (DEF_DIR)
WAIT CLEAR
USE IN TBL
USE IN TMP
GO TOP IN KOL
SELECT KOL
BROWSE NORMAL NOWAIT



Отредактировано (15.03.05 00:35)


------------------
И волки сыты, и овцы целы, и пастуху - вечная память...
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, PaulWist!

Цитата:
FileNameID I - 8 байт
4 байта.
Цитата:
Frequency N(12,10) - по максимуму 20 байт
Ровно 12 - если заменить на тип Double, то будет всего 8 байт - точность не пострадает.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Alex!

Цитата:
А если, к примеру, вставлятьслова в memo-поле
Тогда и BLOCKSIZE крутить - иначе блоками по 64 байта будет резать! А размер fpt ограничен всё теми-же 2Гб.
Цитата:
Должно быть выйдет компактнее в несколько раз
Не совсем.
Во-первых там собственно "размер блока" и "тип блока" хранятся - соответственно 8 байт на каждый элемент уже теряем.
Во-вторых с индексацией будут вопросы - придётся по какой-то функции индексировать ("просто так" memo не индексируется, что вполне разумно) - это потеря скорости. Кроме того может встать вопрос о размере индексного файла - он ограничен всё теми-же 2Гб. Без индекса перебор 2Гб да ещё и с memo - это сущий кошмар будет
В-третьих работа с memo в Shared режиме вызывает накопление "мусора" в fpt - фокс НЕ переписывает там блоки, а добавляет новые по мере модификаций (даже если данные отлично помещаются и в пространство старого блока).
Ну и наконец даже если удастся увеличить "ёмкость" таблицы в 2 раза (что есть далеко не факт) - то проблема всё равно появится - просто чуть позже. В общем что-то делать с "разделением" на ряд таблиц нужно. Только автоматом тут ничего не бывает - всё придётся руками рисовать...

Насчёт числа слов в языке я согласен - тем более что язык английский - и там даже БЕЗ устранения различий словоформ так много слов не будет. Видимо тут имеет место ошибка со структурой таблиц (СЛОВА по идее нужно хранить отдельно от их "частоты употребления в тексте") - т.е. таблица частоты - это File Int + Word Int + Freq Double - итого 17 байт на элемент - т.е. порядка 128 миллионов. Собственно слова - хранить в отдельной таблице - там можно и 50 байт/слово (словарь на 40млн - это явно перекроет все потребности анализа интернета ) - т.к. слов явно поменьше будет. Кроме того таким макаром можно сразу решать проблему "отсечения" всяких "паразитов" - т.е. не-слов/предлогов/атриклей/местоимений - возможно нормальных слов, но не интересных с точки зрения поставленной задачи - например банальные числительные "one two ... firts second ..." вряд-ли как-то поспособствуют определению смысловой направленности текста




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как лучше работать с таблицами вышедшими за пределы 2Гб?
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Цитата:
Цитата:
FileNameID I - 8 байт

4 байт

Да, правильно, спутал с Numeric в памяти.

Цитата:
Frequency N(12,10) - по максимуму 20 байт
Ровно 12

ну написано - по максимуму.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика