我在Windows 7上运行了一个在Cygwin下编译的程序,并将"NUL"作为输出文件名传递.它实际上在当前目录中创建了一个名为"NUL"的文件,而不是抑制输出.(显然它预计"/ dev/null",即使在Windows上也是如此.)现在我坚持使用这个我无法删除的"NUL"文件!
我已经尝试过了:
remove() 在C程序中 - 也失败了我怎样才能摆脱这些NUL文件(我现在有几个),没有安装完整的Cygwin环境并在Cygwin下编译C程序来完成它?
是否有可能.NET 3.5应用程序告诉.NET运行时:"嘿,我稍后会使用n MB内存,所以请现在提交那么多或现在失败?"
这个的上下文是:我有一个C#控制台应用程序,它运行一个返回大量数据的数据库查询,然后对其进行一些处理.查询可能需要很长时间(小时),并且在读取结果时内存使用量会不断增加.查询完成后,由于我需要处理,内存会立即出现峰值.如果机器没有足够的RAM,则应用程序在此时失败 - 在查询上浪费了几个小时之后!这对用户来说非常令人沮丧.如果没有足够的RAM,我希望应用程序快速失败.
当然,我可以尝试一些hack,比如分配一个我不需要的大型数组,然后在我真正需要内存之前将其设置为null,但这并不理想,因为它可能实际上导致进程耗尽记忆力,否则就足够了.理想情况下,我不想使用比需要更多的内存,但只是在早期失败,除非在我的应用程序运行的整个时间内保证一定数量.这可能吗?
我在PostgreSQL 9.2中有一个plpgsql函数,它返回一个表.该函数运行几个SELECT,返回与函数相同的列,然后返回这些结果或引发异常,具体取决于某些检查.我可以看到这样做的唯一方法是使用FOR ... LOOP,但我无法找到返回行的便捷方法.
我想做这样的事情:
CREATE OR REPLACE FUNCTION my_function()
RETURNS TABLE(column1 integer, column2 boolean, ...)
AS $BODY$
DECLARE
result_row RECORD;
BEGIN
FOR result_row IN (SELECT * FROM other_function_returning_same_columns()) LOOP
IF something_wrong_with(result_row) THEN
RAISE EXCEPTION 'Something went wrong';
END IF;
RETURN NEXT result_row;
END LOOP;
END
$BODY$ LANGUAGE plpgsql STABLE;
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
错误:RETURN NEXT在OUT参数的功能中无法使用参数
我不确定为什么Postgres在这里抱怨,因为我的代码看起来很像文档中的示例,除了我的函数返回TABLE而不是SETOF.没有OUT参数.
我最终成功地使用了它
RETURN QUERY SELECT result_row.column1, result_row.column2, ...;
Run Code Online (Sandbox Code Playgroud)
但是必须一直列出所有列是丑陋的,难以维护.我相信一定有更好的方法.
我在PostgreSQL 9.2中有一个表,看起来像这样(简化):
CREATE TABLE my_features
(
id integer NOT NULL,
feature_id integer NOT NULL,
begin_time timestamp NOT NULL,
end_time timestamp
)
Run Code Online (Sandbox Code Playgroud)
对于每个feature_id,可能有多行,其时间范围由begin_time/end_time指定.它们可能重叠,但这种情况相对较少.我正在寻找一种快速查找所有具有/没有任何重叠的feature_ids的方法.
我尝试使用窗口函数执行此操作,如下所示:
SELECT feature_id, bool_or(end_time > lead(begin_time) OVER ts_win) OVER ts_win AS overlaps_any
FROM my_features
WINDOW ts_win AS (PARTITION BY feature_id ORDER BY begin_time)
Run Code Online (Sandbox Code Playgroud)
...但这不起作用:
ERROR: window function calls cannot be nested
Run Code Online (Sandbox Code Playgroud)
算法很简单:通过begin_time对给定feature_id的行进行排序,并检查是否有end_time>下一个begin_time(如果有的话).我怀疑必须有一个简单的方法来做到这一点,也许是使用tsrange函数,但现在似乎无法找到它.
我有一个C#客户端应用程序,它使用Npgsql在PostgreSQL 9.1.4中调用plpgsql函数.该功能需要很长时间,我想以某种方式向客户报告进度.我该怎么做?
LISTEN/NOTIFY机制听起来很完美,除了整个事务在事务内部运行并且NOTIFY事件直到事务结束才发送,这对我来说是无用的.
我尝试过的另一件事是RAISE NOTICE,我可以在客户端上处理,但即使是那些通知似乎也会缓冲一段时间并分批发送.它总比没有好,但不理想.有什么方法可以"冲洗"它们,所以它们会立即发送给客户吗?
有没有办法告诉ReSharper在项目之前执行某组测试?我仍然希望并行执行,我不需要按每个方法控制它,只是每个类都可以.如果有所不同,测试框架就是MSTest.
我想这样做的原因是一些测试工作在低水平并且非常快,但是其他测试工作在更高级别并且速度慢得多.我希望快速测试首先运行,因为如果它们失败了,那么我知道有什么不对,继续没有意义.但是,ReSharper目前首先运行我的慢速测试.
编辑:测试不按字母顺序运行(VS 2010上的R#7.1).我每个类都有一个源文件.类中的测试似乎按照方法在源代码中出现的顺序运行,但我无法弄清楚R#如何确定测试类的顺序.这就是我所追求的,因为慢速和快速测试是在不同的类中.这也不是按字母顺序排列的,但从运行到运行都是一致的.
编辑2:好的,想通了(见答案).
我有一个包含int []数组的C#类(以及其他几个字段,但数组是主要的).代码经常创建此类的副本,并且分析显示复制此数组的Array.Copy()调用需要花费大量时间.我该怎么做才能让它更快?
数组大小非常小且恒定:12个元素.理想情况下,我喜欢类似C风格的数组:类本身内部的单个内存块(不是指针).这可能在C#中吗?(如果需要,我可以使用不安全的代码.)
我已经尝试过了:
1)使用UIn64和位移代替数组.(每个元素的值也非常小.)这确实使复制速度快,但整体上减慢了程序的速度.
2)为每个数组元素使用单独的字段:int element0,int element1,int element2等.同样,当我必须访问给定索引处的元素时,这总体上较慢.
我想定义一个字典变量,各个主机组可以将自己的密钥添加到group_vars 中(不使用set_fact)。例如这样的事情:
group_vars\ftp_servers.yml:
important_ports:
ftp: 21
Run Code Online (Sandbox Code Playgroud)
group_vars\web_servers.yml:
important_ports:
http: 80
Run Code Online (Sandbox Code Playgroud)
这样,当在具有这两个角色的服务器上运行时,字典就会组合起来,即important_ports=
{
ftp: 21,
http: 80
}
Run Code Online (Sandbox Code Playgroud)
这正是hash_behaviour = merge所做的,但它已被弃用,并将在 Ansible 2.13 中删除。如果没有它,我如何实现同样的目标?
我见过的唯一推荐的解决方案是使用combine过滤器:
set_fact:
important_ports: "{{ important_ports | combine({ http: 80 }) }}"
Run Code Online (Sandbox Code Playgroud)
这在任务中有效set_fact,但在 group_vars 中失败,并显示“在模板字符串中检测到递归循环:{{ important_ports | merge({ http: 80 }) }} ”
我什至尝试将group_vars/all中的变量初始化为空字典 ( important_ports: {}) ,该变量应该在其他 group_vars 之前进行评估,但它仍然给出相同的错误。
我正在寻找一种有效的方法来查找时间戳范围集之间的所有交叉点.它需要与PostgreSQL 9.2一起使用.
假设范围代表一个人可以见面的时间.每个人在可用时可能有一个或多个时间范围.我想找到一个会议可以进行的所有时间段(即,在此期间所有人都可用).
这是我到目前为止所得到的.它似乎有效,但我不认为它非常有效,因为它一次只考虑一个人的可用性.
WITH RECURSIVE td AS
(
-- Test data. Returns:
-- ["2014-01-20 00:00:00","2014-01-31 00:00:00")
-- ["2014-02-01 00:00:00","2014-02-20 00:00:00")
-- ["2014-04-15 00:00:00","2014-04-20 00:00:00")
SELECT 1 AS entity_id, '2014-01-01'::timestamp AS begin_time, '2014-01-31'::timestamp AS end_time
UNION SELECT 1, '2014-02-01', '2014-02-28'
UNION SELECT 1, '2014-04-01', '2014-04-30'
UNION SELECT 2, '2014-01-15', '2014-02-20'
UNION SELECT 2, '2014-04-15', '2014-05-05'
UNION SELECT 3, '2014-01-20', '2014-04-20'
)
, ranges AS
(
-- Convert to tsrange type
SELECT entity_id, tsrange(begin_time, end_time) AS the_range
FROM td …Run Code Online (Sandbox Code Playgroud) 由于可以使用添加PostgreSQL 9.1枚举值
ALTER TYPE my_type ADD VALUE new_value;
Run Code Online (Sandbox Code Playgroud)
但是,尝试将此作为较大脚本的一部分运行会产生错误:
ALTER TYPE ...无法从函数或多命令字符串执行ADD
这使得脚本更改在生产中应用变得非常麻烦,因为支持人员必须记住,虽然大多数脚本可以"正常"运行,但是有一些"特殊"脚本需要在pgAdmin中打开并运行手动,一块一块.我用Google搜索了这个并且我理解了限制 - 无法在事务或"多命令字符串"的一部分中添加枚举值.没关系.我不需要这样做.我只想添加多个枚举值并执行其他不相关的SQL语句,而不必一次为Postgres提供一个语句.
换句话说:我希望能够从pgAdmin和psql运行单个脚本,它只是执行与pgAdmin一样的操作,当我一次突出显示一行并按F5(运行)时.有没有办法做到这一点,也许用plpgsql?
postgresql ×5
sql ×3
.net ×2
c# ×2
plpgsql ×2
ansible ×1
arrays ×1
c ×1
cygwin ×1
date-range ×1
enums ×1
memory ×1
npgsql ×1
null ×1
performance ×1
resharper ×1
unit-testing ×1
unsafe ×1
windows ×1