Mysql 如何进行低内存完全交叉连接?

Mysql 如何进行低内存完全交叉连接?,mysql,unix,memory,awk,cross-product,Mysql,Unix,Memory,Awk,Cross Product,我希望在点的大型数据文件上执行完全自交叉连接。但是,我不能使用编程语言执行该操作,因为我无法将其存储在内存中。我想找到集合中所有点的组合。下面是我的数据集示例 x y 1 9 2 8 3 7 4 6 5 5 我想交叉连接这个数据,生成包含所有点组合的25行表。会有低内存的解决方案吗?可能使用awk 谢谢, 尼古拉斯·海登 另外,我是一个新手程序员。可能需要两个步骤,创建头文件、列1和列2文件,连接列1和列2并附加到头文件 awk 'NR==1{print > "cross"}

我希望在点的大型数据文件上执行完全自交叉连接。但是,我不能使用编程语言执行该操作,因为我无法将其存储在内存中。我想找到集合中所有点的组合。下面是我的数据集示例

x y 
1 9 
2 8 
3 7 
4 6 
5 5 
我想交叉连接这个数据,生成包含所有点组合的25行表。会有低内存的解决方案吗?可能使用
awk

谢谢,

尼古拉斯·海登


另外,我是一个新手程序员。

可能需要两个步骤,创建头文件、列1和列2文件,连接列1和列2并附加到头文件

awk 'NR==1{print > "cross"} NR>1 {print $1 > "col1"; print $2 > "col2"}' file
join -j9 col1 col2 -o1.1,2.1 >> cross
rm col1, col2
显然,要确保临时文件名和最终文件名不会与现有文件名冲突

注意,MacOS上的
join
命令没有
-j
选项,因此将其更改为等效的长格式

join -19 -29 col1 col2 -o1.1,2.1 >> cross

在两种方案中,我们都要求join使用不存在的第9个字段作为键,将第一个文件的每一行与第二个文件的每一行相匹配,以生成两个文件的叉积。

如果内存使用不是问题,我可能会这样做:

$ awk 'NR==1 { print; next }          # print the header
      { x[NR]=$1; y[NR]=$2 }          # read data ro two hashes x and y
      END { for(i=2;i<=NR;i++)
                for(j=2;j<=NR;j++)
                    print x[i],y[j]   # print all combinations of x and y
      }' file

我可能永远不会使用该代码,因为它对任何有用的东西都有用,但也许您可以将这两种解决方案混合使用,以创建合适的解决方案。

如果这是一个不明智的问题,请道歉。我收到您的
join-j9 col1 col2-o1.1,2.1>>cross
命令出现
usage
错误,完整错误消息是什么?什么操作系统,哪个shell?
用法:join[-a fileno |-v fileno][e string][1 field][2 field][o list][t char]file1 file2
我正在mac OS上运行
bash
。好的,您的版本没有
-j
选项,更改为
-19-29
为什么使用
join
比将数据读入任何其他工具使用更少的内存?
$ awk 'NR==1 { print; next }          # print header
      { file=FILENAME; x=$1; nr=1     # duplicate FILENAME, keep $1, create local nr
        while((getline <file) > 0)    # process file record by record
            if(nr++>1) {print x,$2 }  # print $1 of FILENAME and $2 of file
        close(file) }' file           # close the file
x y 
1 9
1 8
1 7
1 6
1 5
2 9
...