mongodb 存储400k行大型Python ruam yaml文件的最佳实践是什么[已关闭]

voj3qocg  于 2023-08-04  发布在  Go
关注(0)|答案(2)|浏览(118)

**已关闭。**此问题是在寻求有关书籍、工具、软件库等内容的建议。它不符合Stack Overflow guidelines。它目前不接受回答。

我们不允许提问以寻求书籍、工具、软件库等方面的建议。您可以编辑问题,以便使用事实和引文回答。
14天前关闭
Improve this question
存储400k行大型python ruam yaml层次结构数据而不丢失数据类型的最佳实践是什么?哪种数据库或流程是此类用例的首选?范围是将数据存储在数据库中以并行进行更改,并通过防止值类型存储最终相同的ruaml yaml文件来导出数据。背景是我的问题,目前加载和处理这么大的文件是不性能。

gfttwv5a

gfttwv5a1#

我不会为ruamel.yaml这么慢而道歉。在加载和转储的各个阶段之间,复制字符串(仍然)有很多开销。此外,在转储后加载标量,以确保保留相同的类型/不会抛出错误(如果不是,标量将被引用)。
我切换到使用msgpack的数据,我不需要阅读/编辑,有时使用自动YAML到msgpack转换,如果YAML文档是新的。当你阅读的次数比更新YAML文件的次数多的时候,这很好用。

import sys
import ruamel.yaml
from ruamel.ext.msgpack import pack, packb, unpackb

yaml_str = """\
- abc: 2023-07-19T11:10:45
  24: some text
  xyz: false
  num: [42, 3.14, 192, 2011-10-02]
"""
    
yaml = ruamel.yaml.YAML(typ='safe')
yaml.explicit_start = True
data = yaml.load(yaml_str)
packed = packb(data)
unpacked = unpackb(packed)
print(unpacked)
yaml.dump(unpacked, sys.stdout)

字符串
其给出:

[{'abc': datetime.datetime(2023, 7, 19, 11, 10, 45, tzinfo=datetime.timezone.utc), 24: 'some text', 'xyz': False, 'num': [42, 3.14, 192, datetime.date(2011, 10, 2)]}]
---
- abc: 2023-07-19 11:10:45+00:00
  24: some text
  xyz: false
  num: [42, 3.14, 192, 2011-10-02]


msgpack允许您定义自己的类型,因此这就是datetime.date的往返方式。
在我的MacBook M1上使用400 k YAML文件的一些计时:

from pathlib import Path
import time

input = Path('input.yaml')
msp = Path('input.msgpack')

yaml = ruamel.yaml.YAML(typ='safe')

start = time.time()
print(f'YAML size:       {input.stat().st_size} bytes')
data = yaml.load(input)
print(f'loading YAML:    {time.time() - start:.4f}s')
start = time.time()
pack(data, msp.open('wb'))
print(f'dumping msgpack: {time.time() - start:.4f}s')
start = time.time()
res = unpackb(msp.open('rb').read())
print(f'loading msgpack: {time.time() - start:.4f}s')
print(f'msgpack size:    {msp.stat().st_size} bytes')


其给出:

YAML size:       409635 bytes
loading YAML:    0.5584s
dumping msgpack: 0.0023s
loading msgpack: 0.0046s
msgpack size:    335021 bytes


在某些情况下,我将msgpack片段作为值存储在lmdb数据库中,但对于400 k的YAML文件,这是IMO的过度。
(生成的)文件input.yaml的前几行:

- hhqOh: [hBGIQ: 65758, dxUft: TPMuQ, Ivtqg: 0.81017, fXWxv: 41737, oyNTi: 0.72261]
  UAiOE: [LScoN: 0.32575, Oiobb: IezAZ, TWgEb: nOUBc, bVhyk: 0.18519, clYGj: 0.21847]
  plZMX: [qrAXr: 14581, yJsQf: true, eEqUy: LqYLD, QLowg: true, tDXhO: 50474]
  jYMHa: [hFwve: 0.58849, webFE: 0.1606, sIAof: unwkQ, VeuTd: bUsCa, nHVpl: nfxTA]
  SWdhe: [bdfNj: 26710, gFNyD: 0.82913, PjbeA: 60539, cATvu: dLCJV, LDipd: VXLPo]
- OcVHH: [Lgoxi: aoxvb, sJapE: YpFPz, UNIno: 36076, vLfxj: false, MRHVp: true]
  dGABY: [QsGRm: 11237, zgQZn: gERdI, yrtKB: EagTp, gRffj: yFPjU, KrisU: 24237]
  nQToo: [wNWPa: 39098, UZKUC: 31512, LjRXJ: false, LiYbv: 95666, KMmXc: 0.83072]
  IQAuv: [fFvpb: 0.27726, xdbJi: nxwTO, cnSNq: true, XgBAs: true, jWUXn: 0.29516]
  oRDgL: [QUtjq: 0.72909, WFhkq: xZncX, DERfo: 49193, IGcCc: 0.73191, EwlAN: Wknml]
- CafQC: [bQAXy: vxPVr, aOMfE: ZjYwt, DKtFX: tYAvA, uQZwX: 0.13786, dpuZJ: 0.52714]
  GzdWI: [DXvrL: true, oDdjF: 86111, yIimq: 0.15527, SvGnc: 0.52369, JykSZ: 22318]
  gsYhF: [AAAtl: 0.58593, lwaxq: dXSZB, ydkvP: PPJlt, mrdcK: TqSPX, MPOzL: 88484]
  sAcnA: [oNJSH: 41688, ZcPUQ: false, oHpNU: 58774, hGrvd: wcVVf, RuojB: fkAIg]
  mzZdj: [UkgBs: 99984, DlPcH: 69679, GfASm: 0.76073, iuSjL: true, LAcLL: false]

jm81lzqq

jm81lzqq2#

一种选择是使用NoSQL数据库,例如MongoDB或Apache Cassandra,它们可以处理大量数据并提供灵活的模式支持。NoSQL数据库可以以更自然的格式存储分层结构,例如嵌套文档或键值对。

相关问题