Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按所需顺序对大型文件进行排序_Python_Linux_Sorting_Bigdata - Fatal编程技术网

Python 按所需顺序对大型文件进行排序

Python 按所需顺序对大型文件进行排序,python,linux,sorting,bigdata,Python,Linux,Sorting,Bigdata,我有以下格式的数据: <j> <l> <n> "jd". <K> <J> <N> <D>. <A> <B> <D> <F>. <E> <F> <G> "abc". <A> <B> <C> <D>. <G> <k> "jd" "l". “jd”。 .

我有以下格式的数据:

<j> <l> <n> "jd".
<K> <J> <N> <D>.
<A> <B> <D> <F>.
<E> <F> <G> "abc".    
<A> <B> <C> <D>.
<G> <k> "jd" "l".
“jd”。
.
.
“abc”。
.
“jd”“l”。
我需要对数据进行排序,以便只对奇数行进行排序,并根据奇数行对相应的偶数行进行排序。i、 e.仅使用奇数行对文件进行排序,即仅对以下行进行排序:

<j> <l> <n> "jd".
<A> <B> <D> <F>.
<A> <B> <C> <D>.
“jd”。
.
.

。
.
“jd”。
而偶数行则按原样复制。例如,上述各项的排序顺序为:

<A> <B> <C> <D>.
<G> <k> "jd" "l".
<A> <B> <D> <F>.
<E> <F> <G> "abc".    
<j> <l> <n> "jd".
<K> <J> <N> <D>.
。
“jd”“l”。
.
“abc”。
“jd”。
.
现在,偶数行
“jd”“l”。
总是出现在奇数行
“abc”之后,
总是出现在奇数行
“abc”之后,
和偶数行
出现在奇数行
“jd”之后。


我尝试使用带有并行选项的linux排序命令,因为我的文件大小是200 GB——但这样做会扰乱奇数行的顺序。是否有某种方法可以使用linux排序命令或使用某种python程序我可以实现200GB文件的预期行为我同意使用linux
sort
程序是一个好主意,因为它非常有效,可以处理比RAM大得多的排序文件。诀窍是在排序之前和之后转换数据,以便
sort
可以执行您想要的操作

您需要在一个循环中读取数据,该循环一次读取两行,将这两行合并为一行,并将新行写入一个新文件

接下来,对新文件进行排序,告诉
sort
仅对一行中的前4个键进行排序

现在,逐行读取排序后的数据,将每行拆分为两行,并将拆分后的数据写入最终的目标文件


行拆分和连接程序可以很容易地用awk或Python编写。我建议您自己编写,但如果您在让它们正常工作方面遇到问题,我很乐意提供帮助(我相信其他人也会这样做)。

因为您使用的是linux,我假设您已经安装了vim(在我的ubuntu机器上默认安装了一个最低版本)。 如果没有,请先安装它

我相信vim可以处理大文件而不会阻塞(与记事本不同)

  • 使用vim,将每一行与其下方的行合并
  • input.dat

    g是全局命令,它匹配具有行开始(^)的每一行(即每一行),并执行join命令。 然后,将每一条偶数线附加到其前一条不均匀线上,并用两个空格分隔

    然后将其保存(覆盖!)为join.dat并退出

  • 像通常使用Sort命令一样对join.dat文件进行排序
  • 排序的.dat

    在这个场景中,sed基本上替换了一个点和两个空格来表示一个点和一个换行符,有效地替换了vim引入的两个空格来连接这些行


    我知道这不是一个非常优雅的解决方案(更不用说pythonic了),但它避免了“必须编写自定义程序”和它涉及的内存问题。

    您需要类似于
    map reduce
    的东西来为问题的子集找到解决方案:仅4行。然后你就可以用python来实现这一点,方法是将文件分割成不同的文件。你可能需要一种使用硬盘作为存储的高效排序算法,例如mergesort或类似的算法。@taesu我的问题是我找不到这样的解决方案问题是我没有得到问题子集的排序算法,或者它需要太多的脑力!
    <A> <B> <C> <D>.
    <G> <k> "jd" "l".
    <A> <B> <D> <F>.
    <E> <F> <G> "abc".    
    <j> <l> <n> "jd".
    <K> <J> <N> <D>.
    
    <j> <l> <n> "jd". 
    <K> <J> <N> <D>.
    <A> <B> <D> <F>.
    <E> <F> <G> "abc".
    <A> <B> <C> <D>.
    <G> <k> "jd" "l".
    
    <j> <l> <n> "jd".  <K> <J> <N> <D>.
    <A> <B> <D> <F>a  <E> <F> <G> "abc".
    <A> <B> <C> <D>.  <G> <k> "jd" "l".
    
    <A> <B> <C> <D>.  <G> <k> "jd" "l".
    <A> <B> <D> <F>a  <E> <F> <G> "abc".
    <j> <l> <n> "jd".  <K> <J> <N> <D>.
    
    <A> <B> <C> <D>.
    <G> <k> "jd" "l".
    <A> <B> <D> <F>.
    <E> <F> <G> "abc".
    <j> <l> <n> "jd".
    <K> <J> <N> <D>.