我有一个原始文本文件,大小为8.1GB。 输入数据非常直接: Lab_A(字符串),Lab_B(字符串),距离(浮点)
我试图使用LOAD DATA INFILE将数据加载到表中,但驱动器空间不足。
目标表格式如下:
Id(INT),Lab_A(VARCHAR),Lab_B(VARCHAR),距离(FLOAT)。 主键为Id,索引为(Lab_A + Distance)。
在下面创建声明:
CREATE TABLE 'warwick_word_suite'.'distances' (
'id' INT NOT NULL AUTO_INCREMENT,
'label1' VARCHAR(45) NOT NULL,
'label2' VARCHAR(45) NOT NULL,
'distance' FLOAT NOT NULL,
PRIMARY KEY ('id'),
INDEX 'LABEL_INDEX' ('label1' ASC, 'distance' ASC));
驱动器有50GB并且空间不足。鉴于为系统保留了10GB,我假设该表请求超过>表格为32GB。
我的问题是:
我应该为数据库服务器订购一个更大的驱动器吗?
编辑: 我将数据需求跟踪到“ibdata1”,存储在/ var / lib / mysql中。该文件占用30.3GB。
答案 0 :(得分:0)
双重麻烦。
InnoDB占用原始数据的2倍-3倍。这是粗略的近似;有很多因素。
ibdata1
是放置表格的默认位置。试图把表放在那里,该文件不会缩小。这可能是个问题。在尝试加载文件之前让innodb_file_per_table = ON
更好。然后该表将进入一个单独的.ibd
文件,一旦失败,该文件就会消失。实际上,您的磁盘空间不足,没有简单的方法来恢复它。 (恢复包括转储所有其他InnoDB表,停止mysqld,删除ibdata1,重新启动,然后重新加载其他表。
回到最终问题......如何使用数据。首先,我们可以看到数据的样本(几行)。可能有一些线索。表格中的行数(或文件中的行数)?
这可能是加载到MyISAM而不是InnoDB的情况;该表的大小将接近8.1GB,加上两个索引,可能会增加另外5-10GB。仍然令人不快地紧张。
将实验室名称标准化可能会有很大的好处。假设你有10K实验室和100M距离(每个实验室到每个其他实验室)。其中一半是多余的?标准化实验室名称每行可节省50个咬 - 可能是空间的一半?
或者你可以获得更多的磁盘空间。
考虑您要解决的上述建议;让我们知道你还需要什么帮助。