小编dev*_*ell的帖子

sqlalchemy批量更新性能问题

我需要定期使用文件中收到的数据增加列中的值.该表有> 400000行.到目前为止,我的所有尝试都会导致性能非常差.我写了一个反映我要求的实验:

#create table
engine = create_engine('sqlite:///bulk_update.db', echo=False)
metadata = MetaData()

sometable = Table('sometable',  metadata,
    Column('id', Integer, Sequence('sometable_id_seq'), primary_key=True),
    Column('column1', Integer),
    Column('column2', Integer),
)

sometable.create(engine, checkfirst=True)

#initial population
conn = engine.connect()
nr_of_rows = 50000
insert_data = [ { 'column1': i, 'column2' : 0 } for i in range(1, nr_of_rows)]
result = conn.execute(sometable.insert(), insert_data)

#update
update_data = [ {'col1' : i, '_increment': randint(1, 500)} for i in range(1, nr_of_rows)]

print "nr_of_rows", nr_of_rows
print "start time   : " + str(datetime.time(datetime.now()))

stmt = …
Run Code Online (Sandbox Code Playgroud)

python sqlite sqlalchemy bulk-load sql-update

16
推荐指数
1
解决办法
2846
查看次数

Ramda,无论顺序如何,数组均等

比较数组时,equals仅当两个数组以相同顺序保存相同值时,ramda才会返回 true。

我需要一个函数来检查两个数组是否包含完全相同的值,但忽略值出现的顺序。

现在我是这样做的:

const equalLength = (arr1, arr2) => arr1.length === arr2.length

export const equalIgnoreOrder = (arr1, arr2) =>
  equalLength(arr1, arr2) && equalLength(arr1, R.union(arr1, arr2))
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更多“开箱即用”的解决方案?

javascript ramda.js

2
推荐指数
1
解决办法
1108
查看次数

使用 forEach 和 async/await,对于 Node 和 Jest 的行为不同

我有一个将数据写入 mongodb 的函数,如下所示:

const writeToDB = async (db, data) => {
  const dataKeys = Object.keys(data)
  dataKeys.forEach(async key => db.collection(key).insertMany(data[key]))
}
Run Code Online (Sandbox Code Playgroud)

如果我在节点脚本中运行它,效果很好。但是当我尝试在 Jest 中使用它时,beforeAll我从 Jest 中得到了这个异步错误:

测试运行完成后,Jest 一秒钟都没有退出。这通常意味着测试中存在未停止的异步操作。

经过一些故障排除后,我发现这forEach是造成问题的原因。使用for循环解决了这个问题:

const writeToDB = async (db, data) => {
  const dataKeys = Object.keys(data)
  for (const key of dataKeys) {
    await db.collection(key).insertMany(data[key])
  }
}
Run Code Online (Sandbox Code Playgroud)

搜索这个问题我遇到了这篇文章: https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404

那里的解释很有道理,但它给我留下了一些疑问:

  • 根据该文章,即使在节点脚本中它也不应该起作用。怎么就这样了?
  • 为什么在 Node 中执行它与在 Jest 中运行它不同?

编辑

读完所有评论后,我意识到我的第一个问题有点无稽之谈。通常我将异步函数的结果分配给变量,如果我不放置等待,则会出现未定义的错误。但这里的情况并非如此,因此脚本正常退出,并且数据库写入在后台同时发生。

javascript node.js async-await jestjs

2
推荐指数
1
解决办法
7850
查看次数