首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何做一个低RAM全交叉连接?

如何做一个低RAM全交叉连接?
EN

Stack Overflow用户
提问于 2017-04-15 03:56:49
回答 2查看 105关注 0票数 1

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

代码语言:javascript
复制
x y 
1 9 
2 8 
3 7 
4 6 
5 5 

我想交叉连接在这个数据上,生成包含所有点组合的25行表。会有一个低记忆的解决方案吗?也许和awk在一起?

谢谢,

尼古拉斯·海登

我是个新手程序员。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-15 04:35:31

也许在两个步骤中,创建一个头文件,column1和column2文件,并加入column1和column2并附加到头文件

代码语言:javascript
复制
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

显然,确保临时文件名和最终文件名不会与现有文件名称冲突。

注意,join命令在MacOS上没有-j选项,所以将其更改为等效的长形式

代码语言:javascript
复制
join -19 -29 col1 col2 -o1.1,2.1 >> cross

在这两个选项中,我们都要求join使用不存在的第9个字段作为键,它将第一个文件的每一行与第二个文件中的每一行匹配,以生成这两个文件的交叉乘积。

票数 1
EN

Stack Overflow用户

发布于 2017-04-15 05:30:13

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

代码语言:javascript
复制
$ 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

保持低内存使用率显然需要将数据保存在内存之外,这意味着大量访问文件。因此,在处理FILENAME for x时,用另一个名称打开同一个文件(下面是file),并按记录处理y

代码语言:javascript
复制
$ 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
...

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43422037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档