dan113 发表于 2022-7-5 15:54:07

潜在的大型数据库

我正在寻找存储大量数据的最佳方式。我们有一个简单的产品,有数千种不同的可能配置,因为它有6个大小变量,每个都可能没有限制和微小的增量。
 
历史上,我们每次都是用一些旧的从零开始绘制。Net例程,每次引用每个例程的方式都不同。
 
每次画出其中一个,我想给它一个参考,并将所有数据存储在某处。然后我可以使用opendcl快速访问它以进行搜索、过滤和查询。
 
我正在考虑将这些数据存储在字典内的xrecords中,然后在opendcl初始化时使用odbx进行搜索。
 
我需要读写数据,您认为存储这些数据的最佳方式是什么,以便能够快速访问和搜索?
 
使用Tapatalk从my Pixel XL发送

BIGAL 发表于 2022-7-5 16:02:09

Autocad可以与MS Acess对话,就像Excel一样,优点是Access可以拥有大量数据。它还具有index的ie快速查找方法的优点,使用索引查找10000个项目中的数据集需要15次尝试。说搜索一个包含10000行信息的TXT文件是没有效率的。我已经很久没有在二进制文件中使用get&put记录了。10K->15->找到答案。
 
如果您在谷歌上搜索或使用“帮助”,则有很多关于直接从Autocad使用外部数据库的信息。可以肯定的是,它们允许键匹配和索引搜索。我在谷歌上搜索了“autocad to access”,出现了很多代码示例。一个提示是SQL,这是大多数数据库系统背后的序列查询语言。

dan113 发表于 2022-7-5 16:09:28

我确实使用SQL来获取和存储数据,搜索速度非常快,但建立连接有一个滞后。我确实经常使用excel进行数据采集,但滞后性更大。
 
使用Tapatalk从my Pixel XL发送

Roy_043 发表于 2022-7-5 16:16:49

AutoLisp的SQLite(由nullptr AKA Daniel编写)可能会引起兴趣。
 
多个用户会同时访问数据库吗?
 
通过ADODB连接到DB或Excel文件可以更快,并且不需要MS Office。但是为什么要关注速度呢?
 
读取CSV文件并将其转换为全局(或黑板)assoc列表可能可行吗?
 
CSV文件:
idx,name
1,"John"
2,"Peter"关联列表:
(
((idx . 1) (name . "John"))
((idx . 2) (name . "Peter"))
)

Grrr 发表于 2022-7-5 16:24:42

显然,lisp的关键是使用列表作为输出。
我的意见如下:
如果数据依赖于图形:我会使用字典/xrecords/xdata将其存储在dwg中或存储到所需的ACAD对象。
关于大小:如果数据量太大,我会尽量避免使用字典/xrecords/注册表。
 
数据是如何分布的
[列表]
[*]树-然后列表将变成多嵌套的,为了理解其层次结构(使用多嵌套列表或手动),可能您的数据和子数据应该像文件夹和子文件夹一样存储
原子可能代表一个。txt文件。
这在某种程度上与这个想法有关。
 
[*]矩阵表-然后列表将均匀嵌套,数据将通过excel轻松维护(使用lisp,您可以通过矩阵列表访问数据)。
正如罗伊所指出的,但我会避免使用点对,而是使用子列表(虽然它们提供了更快、更简单的访问,但它们可能会破坏您对项目访问方式的可视化,这将导致令人难以置信的错误)。
 
[*]组合-作为层次结构的多嵌套列表(其中数据存储在文件夹和子文件夹中),但原子表示包含矩阵列表信息的excel文件。
[/列表]
您也可以将整个矩阵或多嵌套列表保存在一个。txt文件(可以轻松维护)并读取“n”,使用lisp将其评估为有效列表。
 
关于速度:我不知道该回答什么,因为我从来没有这样的任务或经验。
所以只要想一想什么是最好的方式(坚持接吻原则),然后尝试创建所需的子功能。

BIGAL 发表于 2022-7-5 16:34:06

滞后是什么?一秒钟,一分钟?是来自云端吗
你能提供更多细节吗。

Roy_043 发表于 2022-7-5 16:38:01

@Grrr:你说你想避免点对。这是不是意味着你更喜欢这个
(
((idx 1) (name "John"))
((idx 2) (name "Peter"))
)

Grrr 发表于 2022-7-5 16:43:49

就像这样,罗伊:
 
CSV文件:
idx,name,phone,address
1,"Alan",7676,"Washington DC"
2,"Brian",2424,"Boston"
3,"Chad",3232,"NY"
 
矩阵关联列表:
(setq L
'(
   (idx name phone address)
   (1 "Alan" 7676 "Washington DC")
   (2 "Brian" 2424 "Boston")
   (3 "Chad" 3232 "NY")
)
)
 
一些搜索功能如下:
; _$ (FindItem 'name "John" L) -> nil
; _$ (FindItem 'name "Brian" L) -> (2 "Brian" 2424 "Boston")
; _$ (FindItem 'phone 3232 L) -> (3 "Chad" 3232 "NY")
(defun FindItem ( key val L / aL n )
(setq aL (apply 'mapcar (cons 'list L)))
(if (setq n (vl-position val (assoc key aL)))
   (mapcar (function (lambda (x) (nth n x))) aL)
)
)
 
编辑:
我同意它比经典(cdr(assoc…)慢这是罗伊建议的,但列表更具可读性,因为你不必将每个项目分成一对虚线。
 
还有一个类似搜索的功能:

(setq L
'(
   (idx name phone address)
   (1 "Alan" 7676 "Washington DC")
   (2 "Brian" 2424 "Boston")
   (3 "Chad" 3232 "NY")
   (4 "Derek" 0321 "Florida")
   (5 "Amber" 3021 "Boston")
   (6 "Cortney" 1210 "Florida")
   (7 "Andrew" 9292 "Texas")
)
)

; _$ (FindItems 'name "C*" L) -> ((3 "Chad" 3232 "NY") (6 "Cortney" 1210 "Florida"))
; _$ (FindItems 'address "B*" L) -> ((2 "Brian" 2424 "Boston") (5 "Amber" 3021 "Boston"))
; _$ (FindItems 'phone "3*" L) -> ((3 "Chad" 3232 "NY") (4 "Derek" 321 "Florida") (5 "Amber" 3021 "Boston"))
; _$ (FindItems 'name "H*" L) -> nil
(defun FindItems ( key val L / ToStr i aL nL )
(setq ToStr (lambda (x) (strcase (cond ((eq 'STR (type x)) x) ((vl-prin1-to-string x))))))
(setq val (ToStr val))
(setq aL (apply 'mapcar (cons 'list L)))
(setq i 0)
(if
   (setq nL
   (apply 'append
       (mapcar
         (function
         (lambda (x)
             (setq i (1+ i))
             (if (wcmatch (ToStr x) val)
               (list i)
             )
         )
         )
         (cdr (assoc key aL))
       )
   )
   )
   (mapcar (function (lambda (x) (nth x L))) nL)
)
); defun FindItems

 
电话键有点问题——如果所有原子都是字符串,可能会更好?

Roy_043 发表于 2022-7-5 16:47:59

(setq LstA
'(
   ((idx . 1) (name . "Alan")(phone . 7676) (address . "NY"))
   ((idx . 2) (name . "Brian") (phone . 2424) (address . "Boston"))
   ((idx . 3) (name . "Chad")(phone . 3232) (address . "NY"))
)
)

; (FindItemsA 'address (lambda (str) (= "NY" str)) lstA)
; (FindItemsA 'phone (lambda (num) (< num 6000)) lstA)
(defun FindItemsA (key valPred lst)
(vl-remove
   nil
   (mapcar '(lambda (sub) (if (valPred (cdr (assoc key sub))) sub)) lst)
)
)

hanhphuc 发表于 2022-7-5 16:55:42

 

(defun foo (key pat lst / l n )
(foreach x lst
   (if
   (wcmatch(if (numberp (setq n (cdr (assoc key x)))) (itoa n) n) pat)
      (setq l (cons x l))
   )

)
l
)


;Roy's data format
(foo 'address "*on*" LstA)
;(((IDX . 2) (NAME . "Brian") (PHONE . 2424) (ADDRESS . "Boston")))
(foo 'name "C*" LstA)
;(((IDX . 3) (NAME . "Chad") (PHONE . 3232) (ADDRESS . "NY")))
(foo 'phone "*24*" LstA)
;(((IDX . 2) (NAME . "Brian") (PHONE . 2424) (ADDRESS . "Boston")))

 

;;;Grrr's data format
(defun bar (key pat lst / l n)
(foreach x (cdr lst)
   (if        (wcmatch
(if (numberp (setq n (nth (vl-position key (car lst)) x)))
    (itoa n)
    n
)
pat
)
   (setq l (cons x l))
   )
)
l
)

(bar 'name "*ew*" L)
;((7 "Andrew" 9292 "Texas"))
(bar 'phone "*32*" L)
;((4 "Derek" 321 "Florida") (3 "Chad" 3232 "NY"))
(bar 'address "*da*" L)
;((6 "Cortney" 1210 "Florida") (4 "Derek" 321 "Florida"))

 
我的0.02美元XML怎么样?
页: [1]
查看完整版本: 潜在的大型数据库