数据集概况
首先要想办法获得MIMIC III数据集,以gz压缩包的形式下载得到的2016年的版本是6GB多,解压后有40GB多。gz压缩包和校验文档如下:
- ADMISSIONS.csv.gz
- CALLOUT.csv.gz
- CAREGIVERS.csv.gz
- CHARTEVENTS.csv.gz
- CPTEVENTS.csv.gz
- DATETIMEEVENTS.csv.gz
- DIAGNOSES_ICD.csv.gz
- DRGCODES.csv.gz
- D_CPT.csv.gz
- D_ICD_DIAGNOSES.csv.gz
- D_ICD_PROCEDURES.csv.gz
- D_ITEMS.csv.gz
- D_LABITEMS.csv.gz
- ICUSTAYS.csv.gz
- INPUTEVENTS_CV.csv.gz
- INPUTEVENTS_MV.csv.gz
- LABEVENTS.csv.gz
- LICENSE.txt
- MICROBIOLOGYEVENTS.csv.gz
- NOTEEVENTS.csv.gz
- OUTPUTEVENTS.csv.gz
- PATIENTS.csv.gz
- PRESCRIPTIONS.csv.gz
- PROCEDUREEVENTS_MV.csv.gz
- PROCEDURES_ICD.csv.gz
- README.md
- SERVICES.csv.gz
- SHA256SUMS.txt
- TRANSFERS.csv.gz
- checksum_md5_unzipped.txt
- checksum_md5_zipped.txt
安装PostgreSQL
PostgreSQL大概是MySQL之外最流行的,也是越来越被看好的一款RDBMS。官网下载Windows版本(https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)。我使用的安装包的直接连接是https://get.enterprisedb.com/postgresql/postgresql-13.1-1-windows-x64.exe
数据集比较大,要考虑好吧数据库放在哪儿,尤其是我的笔记本电脑硬盘并不富裕。所以选择了机械硬盘的F盘,如果SSD够用,自然放在SSD使用更快。
我选择安装所有组件,毕竟不差那点硬盘。
数据存放位置是可以选择的,这比MySQL要人性化。
为管理员用户设置密码,我记录一下我的密码,是家里老台式机的名字。
监听端口就默认吧,其他软件应该会默认识别这个端口,最好别改。
本地化方面,我不知道默认的本地化是什么,所以选择英语(美国),这应该是比较容易获得帮助,不容易出错并且最受支持的语言方案。
最后是概览安装配置。
安装完成后我选择启动stack builder看看有什么能用的工具。此时要把系统的代理(V2N)设置成全局模式,否则有网站证书不信任的错误。
看了一眼,暂时似乎没有要用到的,那就算了吧。
从CSV导入数据到数据库
此处参考了MIMIC官网的教程。https://mimic.physionet.org/tutorials/install-mimic-locally-windows/
从MIMIC的代码中找到buildmimic\postgres文件夹里的sql文件。(我看到有支持MySQL的文件,但是为了减少错误,还是依照推荐的配置使用PostgreSQL)
文件夹里的文件有:
- Makefile
- README.md
- create_mimic_user.sh
- postgres_add_comments.sql
- postgres_add_constraints.sql
- postgres_add_indexes.sql
- postgres_checks.sql
- postgres_create_tables.sql
- postgres_create_tables_pg10.sql
- postgres_load_data.sql
- postgres_load_data_7zip.sql
- postgres_load_data_gz.sql
官方教程里有使用命令行工具直接从gz压缩包里导入数据而无需解压的教程,但是我已经解压了,就跳过这一部分。
按照官方教程,在开始菜单找到PostgreSQL的SQL Shell,打开,开始使用命令行工具了。
一上来有点懵,不过其实只要回车就好,使用默认的主机、数据库和端口配置来连接到数据库服务。毕竟还是CS模式的数据库系统,shell只是相当于客户端。
输入设置过的密码,就登录了。
接下来按照官网上的SQL指令,先确保空的mimic数据库存在:
DROP DATABASE IF EXISTS mimic;
CREATE DATABASE mimic OWNER postgres;
都没有什么异常。
连接到mimic数据库,这部分和MySQL就不一样了。
\c mimic;
创建schema,名叫mimiciii
CREATE SCHEMA mimiciii;
将搜索路径设置为这个schema,官网提示以后每次使用shell都要使用这个命令改变搜索路径。
set search_path to mimiciii;
再创建表,使用提供的SQL文件创建。这又与MySQL不同。
\i D:/work/mimic-code/buildmimic/postgres/postgres_create_tables.sql
可以使用相对路径,但是我的shell不是在该文件夹下工作的,所以使用了绝对路径。使用路径的时候如果有空格,要把路径用引号包围,我使用的是单引号,经过测试只能使用单引号,不能用双引号。过程中会出现很多”NOTICE: table does not exist”这是很正常的,因为在创建表之前先试图删除已有的表。
终于准备导入数据了,先来做一些调整。首先开启”出错即停止”。
\set ON_ERROR_STOP 1
设置路径变量,指向数据的文件夹。
\set mimic_data_dir 'F:/temp/MIMIC III/mimic-iii-clinical-database-1.4/csv'
由于我使用的是已经解压的csv文件,所以使用
\i ‘F:/temp/MIMIC III/mimic-code-master/buildmimic/postgres/postgres_load_data.sql’
导入数据。
然后就出错了,无法载入CHARTEVENTS.csv。经过查询,据说这是因为这个文件太大,无法载入到内存(我的电脑内存16GB),需要使用直接从压缩文件读取的方式导入数据。
考虑到不想使用7zip,我选择gzip,可以从sourceforge下载到windows版本的二进制文件,我选择压缩包版本,免安装。
http://gnuwin32.sourceforge.net/packages/gzip.htm
我把可执行的gzip放在F:\PG\gzip\bin,然后去系统中PATH添加环境变量。
接下来重新打开shell,重新连接数据库(不必重新创建),重新新建表(同时会自动删掉旧表),重新设置选项,导入数据采用gzip版本的sql脚本,数据文件夹也要改成压缩文件所在的位置。
这次可以看到确实在满速、单核执行导入CHARTEVENTS,还能看到gzip已经在运行。这个CPU占用率也说明PostgreSQL转换数据格式来存储要比gzip解压缩慢很多,gzip需要经常等待PostgreSQL。
过程中很有可在显示下面三行文字后停留很久,因为第四张表CHARTEVENTS数据量极大,需要很久,这是正常现象。
COPY 58976
COPY 34499
COPY 7567
第四行应该会显示COPY 0这也是正常的,因为第四章表是映射关系,并不真正存储数据。
睡前开始导入,早上起来发现导入完成,没有失败,真是太好了。
这些因为chartevents而发生的现象都是正常的,在查询的时候要查询chartevents而不要使用chartevents_1或者chartevents_2这样的名字。
导入数据后使用sql脚本为数据库创建索引,对CHARTEVENTS这个巨大的表创建索引可能也要花很久。
\i D:/work/mimic-code/buildmimic/postgres/postgres_add_indexes.sql
如果愿意的话,还可以使用postgres_add_constraints.sql创建完整性约束,但是我这里就不用了。
尝试查询数据库
导入数据后,可以尝试查询了。
数据量极大,不要像平时的小实验一样不加限制的select整张表。
select
icustay_id, intime, outtime
from icustays
limit 10;
还可以使用脚本检查数据库是否有错误。
\i D:/work/mimic-code/buildmimic/postgres/postgres_checks.sql
还可以添加注释。
\i D:/work/mimic-code/buildmimic/postgres/postgres_add_comments.sql
数据表的注释
大量的缩写和简写,以及非英语母语让我觉得还是有必要贴一下数据表的解释,很简洁的一个页面https://mit-lcp.github.io/mimic-schema-spy/