Есть ли более быстрый способ удалить первые x строк из DBF?
Я пытался использовать CDBFLite для удаления записей файла DBF из записей от 1 до 5 миллионов или около того (чтобы уменьшить размер файла). Из-за не зависящих от меня факторов, это то, что мне придется делать каждый день. Размер файла превышает 2 ГБ.
Однако для удаления команд требуется вечность. Есть ли более быстрый способ просто удалить первые X записей DBF (и, следовательно, уменьшить размер файла)?
2 ответа
Вот очень грубый план, используя мой пакет dbf:
import dbf
import shutil
database = r'\some\path\to\database.dbf'
backup = r'\some\backup\path\database.backup.dbf')
# make backup copy
shutil.copy(database, backup)
# open copy
backup = dbf.Table(backup)
# overwrite original
database = backup.new(database)
# copy over the last xxx records
with dbf.Tables(backup, database):
for record in backup[-10000:]:
database.append(record)
Я подозреваю, что копирование поверх последней, однако, много записей, которые вы хотите, будет быстрее, чем упаковка.
Как отметил Итан, если файл.DBF, то он обычно ограничен стандартной 32-битной ОС емкостью 2 гигабайта на один файл, когда речь идет о.DBF, если вы не имеете дело с другим программным механизмом, таким как SyBase Database Advantage, который может читать / записывать в файлы.DBF и превышать емкость 2 ГБ.
Тем не менее, стандартный формат DBF имеет один символ на каждой записи в качестве "флага", что запись удаляется, но все еще сохраняет место. Чтобы уменьшить размер, вам нужно упаковать файл, который фактически удаляет удаленные записи и, таким образом, уменьшит размер файла обратно.
Теперь у Итана есть опции через Python, а я через C#.net и использую Microsoft Visual Foxpro OleDb Provider и могу предложить больше, но не знаю, к чему у вас есть доступ.
Если у вас есть VFP (или dBASE) напрямую, то это должно быть так же просто, как добраться до командного окна и сделать
USE [YourTable] exclusive
pack
Но я бы сначала сделал резервную копию файла в качестве простой меры предосторожности.