Stata 知识库包含一个关于从管道读取 ASCII 数据的注释,这将允许人们读取文件而无需将解压缩版本存储在磁盘上。我们从未使用那里显示的方法取得成功 - 我总是收到错误消息
mypipe.pip: not found
。我们有数 TB 的数据压缩得非常好,所以这总是令人失望。我们很想知道它是否适用于其他任何人。
在对此进行调查时,我们发现了一种似乎更好的解决方法。与知识库建议不同,除了 ASCII 文件之外,它还可以处理 .dta 文件。这对我们来说非常有趣。这是通过
use
命令的 http 选项完成的。
我们的第一个尝试是将文件 test.cgi 添加到我们的 webserverscgi-bin
目录:
#!/bin/sh
echo Content-type: application/x-stata
/usr/bin/zcat /data/sample.dta.gz
我们发现
use http://www.nber.org/test
可以从 Stata 工作,但这涉及到很多开销,因为文件在 LAN 上多次旋转,所以我们没有追求从 URL 中获取文件名或以其他方式使其实用。
我们正在开发一种替代方案,它不需要实际的网络服务器,甚至不需要 root 权限。这是通过 nc 命令完成的,该命令随大多数 Linux 发行版一起提供,也可用于 Windows。在 Stata 提示符下运行复合命令:
.! (echo -ne "HTTP/1.0 200 OK\r\n\r\n"; zcat /data/sample.dta.gz;) | nc -l 8080 &
该命令设置计算机将标头和解压缩文件传输到从端口 8080 读取的第一个进程。由于 8080 是高端口,因此无需特殊权限即可使用它。在从该端口读取文件之前,此命令不会返回,届时它将向您显示确切的 Stata 请求。因为 & Stata 在 nc 等待时继续。然后
. use http://127.0.0.1:8080
请注意,您不能使用“localhost”代替 127.0.0.1,因为该use
命令不接受单部分主机名。
如果您的机器上没有 nc,请查找 ncat、netcat 或 socat。某些版本需要在端口号前加上“-p”。您可以在 Windows 机器上安装 nc 并且应该能够做同样的事情,但我们还没有尝试过。
这也可以用于 ascii 文件、加密文件、拆分文件,也许还有其他类型。如果只有 Stat/Transfer 会写入标准输出!
存在一个安全问题 - 您放弃了 Unix 权限位中的读取限制。它也比从磁盘读取未压缩文件要慢,但对我们来说仍然足够快。
我们一直在尝试将其打包成一个 ado 文件,但没有多大成功,因为用户友好的 ado 程序需要自己找到一个可用的端口,我们还没有看到一个好的方法来做到这一点,并进行通信又回到了use命令,对此我们也束手无策。我希望名单上的某个人可能会受到启发提出一种方法,或者 Statacorp 可能只是将解压缩合并到使用命令中。
丹尼尔·芬伯格 feenberg@nber.org