【问题标题】:Is there a faster way to delete the first x rows from a DBF?有没有更快的方法从 DBF 中删除前 x 行?
【发布时间】:2014-10-23 15:51:19
【问题描述】:

我一直在尝试使用 CDBFLite 从记录 1 到 500 万左右删除 DBF 文件的记录(以减小文件大小)。由于我无法控制的因素,这是我每天都必须做的事情。文件大小超过 2 GB。

但是,运行删除命令需要很长时间。有没有更快的方法来消除 DBF 的前 X 条记录(从而导致文件更小)?

【问题讨论】:

  • 或者有没有办法从顶部截断?
  • 文件大小可能是个问题——我似乎记得dbf 标准不支持大于该大小的文件。我已经编写了一个 Python dbf 库,我愿意解决这个问题,但我需要一份你的数据库副本来进行测试。如果您有兴趣,请告诉我。 (免费,以防有人担心。)

标签: database performance optimization delete-row dbf


【解决方案1】:

正如 Ethan 所指出的,如果是 .DBF 文件,当涉及到 .DBF 时,它通常以标准 32 位操作系统容量为上限,即每个文件 2 gig,除非您正在处理其他软件引擎,例如 SyBase Database Advantage它可以读取/写入 .DBF 文件并超过 2 gig 容量。

也就是说,DBF 标准格式在每条记录上都有一个字符作为记录被删除的“标志”,但仍保留空间。为了减小大小,您需要对实际删除已删除记录的文件进行 PACK,从而将文件大小减小。

现在 Ethan 有通过 Python 的选项,我通过 C#.net 和使用 Microsoft Visual Foxpro OleDb Provider 可以提供更多,但不知道你可以访问什么。

如果您直接拥有 VFP(或 dBASE),那么它应该就像进入命令窗口并执行操作一样简单

USE [YourTable] exclusive
pack

但作为简单的预防措施,我会先备份文件。

【讨论】:

  • 评论与否决票是一件好事。我认为这个答案没有任何错误或无益。
【解决方案2】:

这是一个非常粗略的大纲,使用我的dbf package

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)

我怀疑复制过去无论你想要多少记录都会比打包更快。

【讨论】:

  • 我会试一试并告诉你
  • 我忘记了切片符号,但 [-10000:] 不是表示最后 10000 条记录吗?我不需要 [10000:] 说“复制除前 10000 条记录之外的所有内容”吗?
  • 另外,为每条记录执行附加操作是否需要很长时间?有没有办法同时杀死大量记录?
  • 不幸的是,这似乎需要很长时间:(
  • @MyNameIsKhan:是的,[-10000:] 表示最后 10,000 条记录。代码是选择要复制的记录,而不是要省略的记录。
猜你喜欢
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2018-06-13
相关资源
最近更新 更多