Как читать двоичный формат Stata из сжатого файла - PullRequest
5 голосов
/ 19 августа 2011

База знаний Stata включает примечание о чтении данных ASCII из канала, которое позволит прочитать файл без сохранения распакованной версии на диске. Мы никогда не имел успеха с методом, показанным там - я всегда получаю сообщение об ошибке mypipe.pip: not found. У нас есть терабайты данных, которые сжимаются очень хорошо, поэтому это всегда было разочарованием. Нам было бы интересно услышать, если это работает для кто-нибудь еще.

При изучении этого мы нашли обходной путь, который кажется намного лучше. в отличие от предложение базы знаний, он будет работать с файлами .dta в дополнение к файлам ASCII. Это намного интереснее для нас. Это делается с помощью опции http use команда.

Нашей первой попыткой было добавить файл test.cgi в каталог наших веб-серверов cgi-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' перед номером порта. Вы можете установить nc на машине с Windows и должен быть в состоянии сделать то же самое, но мы не пробовали.

Это также может быть использовано для файлов ascii, зашифрованных файлов, разделенных файлов и, возможно, другие типы. Если бы только Stat / Transfer записывал в стандартный вывод!

Существует проблема безопасности - вы отказываетесь от ограничений на чтение в Unix биты разрешения. Это также медленнее, чем чтение несжатого файла с диска, но все еще достаточно быстро для нас.

Мы пытались упаковать это в файл ado, но без особого успеха, поскольку удобная программа ado должна сама найти доступный порт, что мы еще не видели хороший способ сделать, и передать его обратно на использование Команда, ради которой мы тоже в растерянности. Я надеялся, что кто-то в списке может быть вдохновлен предложить метод или что Statacorp может просто включить декомпрессию в команду использования.

Даниэль Фенберг feenberg@nber.org

...