免责声明:这个问题类似于这里的堆栈溢出问题,但这些答案都不适合我的问题,我稍后会解释.
我正在尝试在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)
这种方法有两个问题:
表大小使索引成为实时问题.它还使得转储到文件然后重新摄取是不可行的.我也没有命令行的优势.我需要在SQL中执行此操作.
我想要做的是直接用一些奇迹命令制作一个精确的副本,或者如果那是不可能的话,复制具有所有约束但没有索引的表,并确保它们是精神上的约束'(又名) SERIAL列的新计数器).然后用a复制所有数据,SELECT *
然后复制所有索引.
来源
关于数据库复制的Stack Overflow问题:由于三个原因,这不是我要求的
pg_dump -t x2 | sed 's/x2/x3/g' | psql
,在此设置中,我无权访问命令行default nextval('x1_id_seq'::regclass)
重置postgres表的序列值的方法:这很好,但不幸的是它非常手动.
我想在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)
但这太丑了.如果我想要前缀后缀或数组元素的空格,我也不知道如何让它工作.
我想statement_timeout
为访问postgres数据库设置默认值.在配置我的环境变量之后,我现在可以psql
在我的首选数据库和表中登录.然而,当我正在探索其中的几个表时,我希望语句超时大约一分钟.这可以通过SET statement_timeout TO '1min';
在每个会话的开头键入来完成,但每次输入都是令人讨厌的.我无权访问服务器配置,也不想更改它.理想情况下,我可以做一些事情alias psql='psql -c "SET statement_timeout TO '1min';"' except the
,psql 的-c`标志的效果不允许交互式输入.有没有解决这个问题的好方法,或者我总是注定要为每个交互式会话手动设置超时?
在文件中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
,我认为会缓存所有不是我的项目的副产品,但它似乎没有任何影响.
有没有办法得到我想要的行为?
我想计算双打流的平均值.这是一个简单的任务,只需要存储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) 我在postgres数据库中有一个表,它在一个测试环境中使用,我们需要一次添加和删除几列.问题是postgres最多有1600列,这个计数包括删除的列.我的桌子上永远不会有1600个"未掉落"的列,但随着时间的推移,它会累积到1600以上.
我已经尝试使用VACUUM
和VACUUM FULL
,我尝试了重铸现有列作为自己的类型(ALTER TABLE table ALTER COLUMN anycol TYPE anytype
)引起的Postgres扫描所有的列和清理离队列存储,但这些复位Postgres的'列数的".
我知道这可以通过复制整个表来解决,但这有其自身的问题,并且是一个单独的问题.
你知道一种方法让postgres忘记它已经删除了列吗?
我知道postgres不是为这样的应用程序设计的,但我不打算理解为什么我们选择以这种方式实现它.如果你有一个替代工具可以使用,我有兴趣听听它,但我仍然想找到解决方案.
我想重复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) 给定一个大小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)
是否有一个更好的,最好是内置的功能,我错过了?
给定一个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) 创建一个笑话测试,例如:
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 特别相关。
我有兴趣创建一个使用队列作为其实现的一部分的函数,但我希望对队列类型进行模板化,以便它根据模板化的队列类型具有不同的功能.
这是一个基本的例子:
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 1
和example<queue<int>>()
打印3 1 2
.这适用于stack
和priority_queue
,但不幸的是queue
没有提供top
,而是提供front
.有没有一种简单的方法来告诉编译器,当它看到top
一个queue
叫front
呢?
我能想到的唯一解决方法是遵循这个问题如何使用模板模板参数为STL容器实现通用方法,该方法不需要该方法所需的通用接口,并top
为每种数据类型实现我自己的本地打电话给那个.这个解决方案似乎超级优雅,如果可能的话,我宁愿找到另一种方式.
编辑:我正在使用支持C++ 11的编译器,准确地说是gcc 4.7.0.