小编Eri*_*rik的帖子

使用SQL完全复制postgres表

免责声明:这个问题类似于这里的堆栈溢出问题,但这些答案都不适合我的问题,我稍后会解释.

我正在尝试在postgres中复制一个大表(大约40M行,100多列),其中很多列都被索引.目前我使用这个SQL:

CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;
Run Code Online (Sandbox Code Playgroud)

这种方法有两个问题:

  1. 它在数据摄取之前添加索引,因此比创建没有索引的表需要更长的时间,然后在复制所有数据后进行索引.
  2. 这不会正确复制`SERIAL'样式列.它不是在新表上设置新的"计数器",而是将新表中列的默认值设置为过去表的计数器,这意味着它不会随着行的添加而增加.

表大小使索引成为实时问题.它还使得转储到文件然后重新摄取是不可行的.我也没有命令行的优势.我需要在SQL中执行此操作.

我想要做的是直接用一些奇迹命令制作一个精确的副本,或者如果那是不可能的话,复制具有所有约束但没有索引的表,并确保它们是精神上的约束'(又名) SERIAL列的新计数器).然后用a复制所有数据,SELECT *然后复制所有索引.

来源

  1. 关于数据库复制的Stack Overflow问题:由于三个原因,这不是我要求的

    • 它使用命令行选项pg_dump -t x2 | sed 's/x2/x3/g' | psql,在此设置中,我无权访问命令行
    • 它创建索引前数据摄取,这很慢
    • 它没有正确更新串行列作为证据 default nextval('x1_id_seq'::regclass)
  2. 重置postgres表的序列值的方法:这很好,但不幸的是它非常手动.

sql postgresql data-migration

68
推荐指数
4
解决办法
8万
查看次数

bash数组的前缀和后缀元素

我想在bash中预先修复一个数组,类似于大括号扩展.

说我有一个bash数组

ARRAY=( one two three )
Run Code Online (Sandbox Code Playgroud)

我想能够像下面的大括号扩展一样预先修改它

echo prefix_{one,two,three}_suffix
Run Code Online (Sandbox Code Playgroud)

我能找到的最好用的是使用bash regex来添加前缀或后缀

echo ${ARRAY[@]/#/prefix_}
echo ${ARRAY[@]/%/_suffix}
Run Code Online (Sandbox Code Playgroud)

但我找不到任何关于如何同时做两件事的事情.我可能会使用正则表达式捕获并执行类似的操作

echo ${ARRAY[@]/.*/prefix_$1_suffix}
Run Code Online (Sandbox Code Playgroud)

但似乎bash变量正则表达式替换中不支持捕获.我还可以存储一个临时数组变量

PRE=(${ARRAY[@]/#/prefix_})
echo ${PRE[@]/%/_suffix}
Run Code Online (Sandbox Code Playgroud)

这可能是我能想到的最好的,但它似乎仍然低于标准杆.最后一种选择是使用类似于的for循环

EXPANDED=""
for E in ${ARRAY[@]}; do
    EXPANDED="prefix_${E}_suffix $EXPANDED"
done
echo $EXPANDED
Run Code Online (Sandbox Code Playgroud)

但这太丑了.如果我想要前缀后缀或数组元素的空格,我也不知道如何让它工作.

regex arrays bash

26
推荐指数
3
解决办法
8609
查看次数

psql将默认的statement_timeout设置为postgres中的用户

我想statement_timeout为访问postgres数据库设置默认值.在配置我的环境变量之后,我现在可以psql在我的首选数据库和表中登录.然而,当我正在探索其中的几个表时,我希望语句超时大约一分钟.这可以通过SET statement_timeout TO '1min';在每个会话的开头键入来完成,但每次输入都是令人讨厌的.我无权访问服务器配置,也不想更改它.理想情况下,我可以做一些事情alias psql='psql -c "SET statement_timeout TO '1min';"' except the,psql 的-c`标志的效果不允许交互式输入.有没有解决这个问题的好方法,或者我总是注定要为每个交互式会话手动设置超时?

postgresql

15
推荐指数
2
解决办法
3万
查看次数

Gitlab docker executor - 在before_script之后缓存图像

在文件中gitlab-ci有一个选项,.gitlab-ci.yml用于在任何实际脚本运行之前执行命令,称为before_script..gitlab-ci.yml示例说明了在此安装辅助程序.但是,我注意到的是,使用docker执行程序时,Docker中没有缓存这些更改.我天真地假设在运行这些命令后,docker会缓存图像,因此对于下一次运行或测试,docker只会加载之后生成的缓存图像before_script.这将大大加快构建速度.

举个例子,我.gitlab-ci.yml看起来有点像:

image: ubuntu

before_script:
    - apt-get update -qq && apt-get install -yqq make ...

build:
    script:
        - cd project && make
Run Code Online (Sandbox Code Playgroud)

一个可能的解决方案是转到跑步机并创建一个docker镜像,可以构建我的软件而无需任何其他安装,然后image在yaml文件的部分中引用它.这样做的缺点是,无论何时我想添加依赖项,我都需要登录到转轮计算机并在构建成功之前更新映像.如果我只是必须将依赖项添加到结尾apt-get install并且让docker/gitlab-ci处理适当的缓存,那将会更好.

还有一个cache命令.gitlab-ci.yml,我尝试设置untracked: true,我认为会缓存所有不是我的项目的副产品,但它似乎没有任何影响.

有没有办法得到我想要的行为?

gitlab docker gitlab-ci gitlab-ci-runner

9
推荐指数
2
解决办法
3104
查看次数

增量浮点均值算法的选择(java)

我想计算双打流的平均值.这是一个简单的任务,只需要存储double和int.我是使用apache commons SummaryStatistics类做的.但是,在测试时我注意到SummaryStatistics意味着浮点错误,我自己的python实现没有.经过进一步检查,我发现公共区域正在使用以下算法的版本:

static double incMean(double[] data) {
    double mean = 0;
    int number = 0;
    for (double val : data) {
        ++number;
        mean += (val - mean) / number;
    }
    return mean;
}
Run Code Online (Sandbox Code Playgroud)

这有时会导致小的浮点错误,例如

System.out.println(incMean(new double[] { 10, 9, 14, 11, 8, 12, 7, 13 }));
// Prints 10.500000000000002
Run Code Online (Sandbox Code Playgroud)

这也是番石榴实用程序DoubleMath.mean使用的平均算法.我觉得他们都使用上面的算法而不是更天真的算法似乎很奇怪:

static double cumMean(double[] data) {
    double sum = 0;
    int number = 0;
    for (double val : data) {
        ++number;
        sum += val;
    }
    return sum / number;
} …
Run Code Online (Sandbox Code Playgroud)

java statistics mean guava apache-commons-math

7
推荐指数
1
解决办法
1032
查看次数

清除postgres删除列的知识

我在postgres数据库中有一个表,它在一个测试环境中使用,我们需要一次添加和删除几列.问题是postgres最多有1600列,这个计数包括删除的列.我的桌子上永远不会有1600个"未掉落"的列,但随着时间的推移,它会累积到1600以上.

我已经尝试使用VACUUMVACUUM FULL,我尝试了重铸现有列作为自己的类型(ALTER TABLE table ALTER COLUMN anycol TYPE anytype)引起的Postgres扫描所有的列和清理离队列存储,但这些复位Postgres的'列数的".

我知道这可以通过复制整个表来解决,但这有其自身的问题,并且是一个单独的问题.

你知道一种方法让postgres忘记它已经删除了列吗?

我知道postgres不是为这样的应用程序设计的,但我不打算理解为什么我们选择以这种方式实现它.如果你有一个替代工具可以使用,我有兴趣听听它,但我仍然想找到解决方案.

postgresql

5
推荐指数
1
解决办法
1966
查看次数

沿轴0重复一个scipy csr稀疏矩阵

我想重复scipy csr稀疏矩阵的行,但是当我尝试调用numpy的repeat方法时,它只是将稀疏矩阵视为一个对象,并且只会将其重复为ndarray中的一个对象.我查看了文档,但是我找不到任何实用程序来重复scipy csr稀疏矩阵的行.

我编写了以下代码来处理内部数据,这似乎有效

def csr_repeat(csr, repeats):
    if isinstance(repeats, int):
        repeats = np.repeat(repeats, csr.shape[0])
    repeats = np.asarray(repeats)
    rnnz = np.diff(csr.indptr)
    ndata = rnnz.dot(repeats)
    if ndata == 0:
        return sparse.csr_matrix((np.sum(repeats), csr.shape[1]),
                                 dtype=csr.dtype)
    indmap = np.ones(ndata, dtype=np.int)
    indmap[0] = 0
    rnnz_ = np.repeat(rnnz, repeats)
    indptr_ = rnnz_.cumsum()
    mask = indptr_ < ndata
    indmap -= np.int_(np.bincount(indptr_[mask],
                                  weights=rnnz_[mask],
                                  minlength=ndata))
    jumps = (rnnz * repeats).cumsum()
    mask = jumps < ndata
    indmap += np.int_(np.bincount(jumps[mask],
                                  weights=rnnz[mask],
                                  minlength=ndata))
    indmap = indmap.cumsum()
    return sparse.csr_matrix((csr.data[indmap],
                              csr.indices[indmap],
                              np.r_[0, indptr_]),
                             shape=(np.sum(repeats), csr.shape[1])) …
Run Code Online (Sandbox Code Playgroud)

python matrix repeat scipy sparse-matrix

5
推荐指数
1
解决办法
1530
查看次数

获取numpy数组的所有子序列

给定一个大小n和整数的numpy数组,m我想生成m数组的所有连续长度子序列,最好是作为二维数组.

例:

>>> subsequences(arange(10), 4)

array([[0, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 7],
       [2, 3, 4, 5, 6, 7, 8],
       [3, 4, 5, 6, 7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

我能做到这一点的最好方法是

def subsequences(arr, m):
    n = arr.size
    # Create array of indices, essentially solution for "arange" input
    indices = cumsum(vstack((arange(n - m + 1), ones((m-1, n - m + 1), int))), 0)
    return arr[indices]
Run Code Online (Sandbox Code Playgroud)

是否有一个更好的,最好是内置的功能,我错过了?

python arrays numpy

4
推荐指数
2
解决办法
1747
查看次数

在numpy中对数组的不均匀段求和

给定一个ndarray x和一个一维数组,其中包含维度为的连续切片的长度x,我想计算一个包含所有切片之和的新数组。例如,在两个维度中,第一个维度的总和为:

>>> lens = np.array([1, 3, 2])
array([1, 3, 2])
>>> x = np.arange(4 * lens.sum()).reshape((4, lens.sum())).astype(float)
array([[  0.,   1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  15.,  16.,  17.],
       [ 18.,  19.,  20.,  21.,  22.,  23.]])
# I want to compute:
>>> result
array([[  0.,   6.,   9.],
       [  6.,  24.,  21.],
       [ 12.,  42.,  33.],
       [ 18.,  60.,  45.]])
# 0 = 0
# 6 = 1 …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy

4
推荐指数
1
解决办法
809
查看次数

笑话找不到“bota”和“atob”

创建一个笑话测试,例如:

test("btoa", () => {
  expect(btoa("aaa")).toStrictEqual("YWFh");
});
Run Code Online (Sandbox Code Playgroud)

失败了

ReferenceError: btoa is not defined
Run Code Online (Sandbox Code Playgroud)

但是,node确实从节点 16 开始定义btoa,因此如下:

console.log(bota("aaa"))
Run Code Online (Sandbox Code Playgroud)

正确输出YWFh.

我如何配置 jest 才能通过此测试?显然,玩笑测试运行程序中发生了一些事情,无法在当前节点环境中执行,或者正在剥离特定的内置程序,只是我似乎找不到任何有关如何调试或调整它的文档。

更新

有一些解决方法可以通过在“纯js”中手动编写编码或依赖于类似的东西来解决,但我特别感兴趣的是为什么笑话执行结束时无法找到似乎存在于其他环境中的内置函数。

这在其他测试框架(如 mocha)中也运行良好,因此它显然与 jest runner 特别相关。

javascript built-in jestjs

4
推荐指数
1
解决办法
2768
查看次数

修改标准STL容器以支持通用队列接口

我有兴趣创建一个使用队列作为其实现的一部分的函数,但我希望对队列类型进行模板化,以便它根据模板化的队列类型具有不同的功能.

这是一个基本的例子:

template <typename Queue>
void example()
{
  Queue a;
  a.push(3);
  a.push(1);
  a.push(2);
  while (!a.empty()) {
    cout << a.top() << ' ';
    a.pop();
  }
  cout << flush;
}
Run Code Online (Sandbox Code Playgroud)

我想要的是example<stack<int>>()打印2 1 3,example<priority_queue<int>>()打印3 2 1example<queue<int>>()打印3 1 2.这适用于stackpriority_queue,但不幸的是queue没有提供top,而是提供front.有没有一种简单的方法来告诉编译器,当它看到top一个queuefront呢?

我能想到的唯一解决方法是遵循这个问题如何使用模板模板参数为STL容器实现通用方法,该方法不需要该方法所需的通用接口,并top为每种数据类型实现我自己的本地打电话给那个.这个解决方案似乎超级优雅,如果可能的话,我宁愿找到另一种方式.

编辑:我正在使用支持C++ 11的编译器,准确地说是gcc 4.7.0.

c++ stl

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