我有一个非常大的文件压缩与gzip坐在磁盘上.生产环境基于"云",因此存储性能很差,但CPU很好.以前,我们的数据处理流程始于gzip -dc
从磁盘上传输数据.
现在,为了并行工作,我想运行多个管道,每个管道都需要一对字节偏移 - 开始和结束 - 并获取该文件的块.使用普通文件,这可以通过head
和实现tail
,但我不知道如何使用压缩文件有效地完成它; 如果我gzip -dc
和管道进入head
,文件末尾的偏移对将涉及浪费地搜索整个文件,因为它慢慢解压缩.
所以我的问题实际上是关于gzip算法 - 理论上是否有可能在底层文件中寻找一个字节偏移量或得到它的任意一块,而没有解压缩整个文件到那一点的全部含义?如果没有,我可以如何有效地将文件分区为多个进程的"随机"访问,同时最小化I/O吞吐量开销?
我在node.js中使用HTTP客户端时试图捕获ECONNREFUSED错误.我正在提出这样的要求:
var http = require('http');
var options = { host: 'localhost', port: '3301', path: '/', method: 'GET' };
http.request(options).on('response', function (res) {
// do some stuff
});
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何捕获此错误:
Error: connect ECONNREFUSED
at errnoException (net.js:614:11)
at Object.afterConnect [as oncomplete] (net.js:605:18)
Run Code Online (Sandbox Code Playgroud)
如果我这样做request.on('error', function () {});
,它就没有抓住它.如果我这样做:
var req = request.on(etc)
req.on('error', function blah () {});
Run Code Online (Sandbox Code Playgroud)
然后我明白了TypeError: Object false has no method 'on'
.
我是否真的必须做一个顶级未捕获错误的事情来处理这个?无论我做什么,我的整个过程都会退出.
编辑:我发现了一些关于如何通过创建connection
对象,调用request
它,然后绑定到connection
对象上的错误的博客文章,但这不会使整个http.request()
快捷方式无用吗?
有pythonic
没有完全面向对象的方法来维护状态(例如,为了优化的目的)?
为了更好地说明我的问题,这里是我在JavaScript中经常使用的模式的示例:
var someFunc = (function () {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
Run Code Online (Sandbox Code Playgroud)
在外部,这只是一个像其他任何函数一样的函数,不需要初始化对象或类似的东西,但闭包允许计算值一次,然后我基本上用作常量.
Python中的一个例子是优化正则表达式 - 使用re.compile
和存储编译版本match
和search
操作很有用.
我知道在Python中执行此操作的唯一方法是在模块范围中设置变量:
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
Run Code Online (Sandbox Code Playgroud)
或者通过创建一个类:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
Run Code Online (Sandbox Code Playgroud)
前一种方法是临时的,并且不清楚上面声明的函数和变量是否相互关联.它也会污染模块的命名空间,我对此并不满意.
后一种方法似乎冗长而且在样板上有点沉重.
我能想到的另一种处理方法是将这样的任何函数分解为单独的文件(模块),然后导入函数,以便一切都干净.
来自更有经验的Pythoners的任何建议如何处理这个?或者你只是不担心它并继续解决问题?
我正在编写一个Go程序,它将使用本机x/crypto/ssh库通过SSH连接到主机并删除一个交互式shell.
我正在使用RequestPty()
,但远程端的(bash)shell与控制代码的行为不符合预期.
当我输入各种控制字符时,它们会被我的终端回复:
$ ^[[A
Run Code Online (Sandbox Code Playgroud)
角色仍然有效,如果按下向上箭头后按Enter键,则运行上一个命令 - 但控制字符输出会破坏应该在那里显示的内容.标签也是如此.
是否有一些直接的方法让这个工作?当我在过去实现类似的系统时,它不是一个问题,因为我刚刚讨论过openssh
,并且进程组的语义将它排除在外.
我研究过" The TTY Demystified ",并且它还不清楚从哪里开始.
我想过要研究的几件事:
openssh
本身必须正确地完成这项工作,但它是一个真正最好的代码库来研究.
实际上我不清楚这个打印是由我的本地终端仿真器或shell还是由远程主机上的代码完成的.
我该从哪里开始?
以下是我的代码示例:
conf := ssh.ClientConfig{
User: myuser,
Auth: []ssh.AuthMethod{ssh.Password(my_password)}
}
conn, err := ssh.Dial("tcp", myhost, conf)
if err != nil {
return err
}
defer conn.Close()
session, err := conn.NewSession()
if err != nil {
return err
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin …
Run Code Online (Sandbox Code Playgroud) 我正试图在我的一些Go包上保持100%的代码覆盖率.这在任何地方都不可行,即使我-integration
在构建系统上使用构建标记选择了一些测试,但它应该可以用于我相对孤立的库包.
但是,我无法处理模糊错误路径的覆盖范围.
下面是我的一个方法示例,它是集成测试的一部分,其中有一个真正的文件系统:
func (idx Index) LoadPost(title string) (*PostSpec, string, error) {
postFolder := strings.Replace(strings.ToLower(title), " ", "_", -1)
spec, err := idx.getSpec(postFolder)
if err != nil {
return nil, "", err
}
f, err := os.Open(path.Join(idx.blogdir, postFolder, "content.html"))
if err != nil {
return nil, "", err
}
defer f.Close()
b, err := ioutil.ReadAll(f)
if err != nil {
return nil, "", err
}
return spec, string(b), nil
}
Run Code Online (Sandbox Code Playgroud)
这是它的样子go tool -cover
:
击中那个区块并不容易.除了创建一个特殊的测试目录,我试图打开的文件不是常规文件,我想不出任何办法.这似乎很复杂.
这本身并不是太多的交易,但这意味着我必须记住,97.3% …
我知道之前已经问过这个问题,但是我无法让JavaScript缩进在Vim中正常工作.
我尝试安装此插件:
http://www.vim.org/scripts/script.php?script_id=3081
我得到这种行为:
if (x == 1) {
alert("nice");
}
Run Code Online (Sandbox Code Playgroud)
这是我的vimrc:
syntax on
set background=light
colorscheme solarized
set tabstop=4
filetype plugin indent on
let g:solarized_termcolors=16
Run Code Online (Sandbox Code Playgroud)
我也试过这个插件:
http://www.vim.org/scripts/script.php?script_id=1840
但这给了我这个:
if (x == 1) {
alert("nice");
}
Run Code Online (Sandbox Code Playgroud)
即,两个选项卡,我只希望它通过单个选项卡缩进.
任何人有任何想法在这做什么?
我将数据存储在磁盘上的文件中,这些文件太大而无法存储在主内存中。
我想通过 将这些数据从磁盘流式传输到数据处理管道中iconv
,如下所示:
zcat myfile | iconv -f L1 -t UTF-8 | # rest of the pipeline goes here
Run Code Online (Sandbox Code Playgroud)
不幸的是,我看到 iconv 在内存中缓冲整个文件,直到它在输出任何数据之前耗尽。这意味着我在管道中的阻塞操作中耗尽了我的所有主内存,否则该管道的内存占用很小。
我试过像这样调用 iconv:
stdbuf -o 0 iconv -f L1 -t UTF-8
Run Code Online (Sandbox Code Playgroud)
但看起来 iconv 本身正在内部管理缓冲——这与 Linux 管道缓冲区无关。
我在 Arch Linux 中用 gblic 2.6 和 2.7 打包的二进制文件中看到了这一点,我在 Debian 中用 glibc 2.5 删除了它。
有没有办法解决这个问题?我知道流式字符转换并不简单,但我原以为这样一个常用的 unix 工具可以在流中工作;处理不适合主内存的文件并不罕见。我是否必须滚动链接到我自己的二进制文件libiconv
?
我正在研究一个跨平台的 Python 项目。它是一个带有 shell 自动完成功能的命令行工具,所以速度很重要。
setuptools
生成控制台脚本的方式至少会产生 150 毫秒的开销 - 有时更多。这对于我正在编写的工具类型来说是完全不可接受的,考虑到它在基本情况下的作用很小,这应该是不必要的。
我正在尝试遵循现代 Python 项目的最佳实践,因此我正在使用它setuptools
来构建项目。该包支持 windows,因此它能够为入口点生成二进制包装器是必不可少的。
无论我如何安装包 - 、、、 等pip install
,都会发生这种情况。pip install -e
pip install --egg
python setup.py install
有一个讨论该问题的github问题,但目前还没有解决方法或解决方案。
在其他地方,我看到人们因此而回到 distutils,但这不是我的项目的选择。
我能想到的唯一解决方法是以某种方式扩展或自定义setuptools
按项目安装时的功能,以便二进制垫片不使用pkg_resources
.
如果没有这种相当激烈和没有建设性的措施,我还能做什么?
我的setup.py
是基本的 - 大致如下:
import pip.req
import setuptools
def install_reqs():
reqs = pip.req.parse_requirements('requirements.txt', session=False)
reqs = [str(ir.req) for ir in reqs]
return reqs
setuptools.setup(
name='myproj',
version='v1.0.0-dev',
packages=setuptools.find_packages(exclude=('tests')),
install_requires=install_reqs(),
include_package_data=True,
entry_points={
'console_scripts': [
'myproj = myproj.cli.myproj:main', …
Run Code Online (Sandbox Code Playgroud) 是否有某种系统调用将返回端口是否可用?或者至少是一种传统的做法,不会让你的过程成为一个坏公民?
目前我正在这样做:
def find_open_port(min_port, max_port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
for port in range(min_port, max_port):
if port > max_port:
raise IOError('Could not find a free port between {0} and {1}'.format(min_port, max_port))
try:
s.bind(('localhost', port))
return port
except socket.error as error:
if error.strerror == 'Address already in use':
continue
else:
raise error
Run Code Online (Sandbox Code Playgroud)
呸!
虽然我已经使用Ruby 1.9了一段时间,但我最近才发现现在支持的更新的哈希语法:
settings = {
host: "localhost",
port: 5984
}
Run Code Online (Sandbox Code Playgroud)
相反:
settings = {
"host" => "localhost"
}
Run Code Online (Sandbox Code Playgroud)
我喜欢它与JavaScript的对象符号的相似性,看起来有点像JSON,所以我可能会切换到使用它与我的所有库,但我仍然希望支持其他用户和我自己的项目,它们采用旧的语法.
所以它真的归结为一个相当简单的问题,即必须测试符号和字符串.是否有一种简单的方法可以将这两条线作为一条线进行?
return true if settings["host"] and settings["db"]
return true if settings[:host] and settings[:db]
Run Code Online (Sandbox Code Playgroud) 我有这个词:
{
'x': [0,1,2],
'y': ['a','b','c']
}
Run Code Online (Sandbox Code Playgroud)
一个字典,其中所有值都是列表,长度相同.
我想要产生这个:
[
{ 'x': 0, 'y': 'a' },
{ 'x': 1, 'y': 'b' },
{ 'x': 2, 'y': 'c' }
]
Run Code Online (Sandbox Code Playgroud)
有没有一种有效的方法来做到这一点?希望用的东西itertools
?
我有一堆字符串,例如,像这样:
<option value="Spain">Spain</option>
Run Code Online (Sandbox Code Playgroud)
我想从里面提取国家的名字.
我在Ruby中想到的最简单的方法是使用这种形式的正则表达式:
country = line.match(/>(.+)</)
Run Code Online (Sandbox Code Playgroud)
但是,这会回来>Spain<
.所以我这样做了:
line.match(/>(.+)</).to_s.gsub!(/<|>/,"")
Run Code Online (Sandbox Code Playgroud)
运作得很好,但如果没有更优雅的方法,我会感到惊讶吗?看起来像使用正则表达式来声明如何找到所需的东西,而实际上并不希望用于匹配它的封闭字符串成为返回数据的一部分.
有这个问题的传统方法吗?