我有一个大的(按线数)纯文本文件,我想分成较小的文件,也按行数.因此,如果我的文件有大约2M行,我想将它分成10个包含200k行的文件,或者包含20k行的100个文件(加上一个包含剩余部分的文件;均匀可分的无关紧要).
我可以在Python中相当容易地做到这一点,但我想知道是否有任何一种使用bash和unix utils的忍者方式(而不是手动循环和计数/分区行).
背景:我正在使用最小构造算法构建一个代表字典的trie.输入列表是4.3M utf-8字符串,按字典顺序排序.生成的图形是非循环的,最大深度为638个节点.我的脚本的第一行将递归限制设置为1100 sys.setrecursionlimit()
.
问题:我希望能够将我的trie序列化到磁盘,因此我可以将其加载到内存中而无需从头开始重建(大约22分钟).我曾经尝试都pickle.dump()
和cPickle.dump()
,用文本和二进制协议两种.每次,我得到一个如下所示的堆栈跟踪:
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 725, in save_inst
save(stuff)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 648, in save_dict
self.memoize(obj)
RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)
我的数据结构相对简单: trie
包含对开始状态的引用,并定义了一些方法. dfa_state
包含布尔字段,字符串字段和从标签到状态的字典映射.
我对内部工作原理并不十分熟悉pickle
- …
经过五年的专业Java(以及在较小程度上,Python)编程并慢慢感觉我的计算机科学教育失控,我决定我想开阔我的视野/对世界的一般用处并做一些感觉更多(对我而言)就像我真的对机器有影响力.我选择学习C和Unix编程,因为我觉得这是许多最有趣的问题.
我的最终目标是能够以专业的方式做到这一点,如果没有其他原因,我必须每周花费40-50小时来支付账单的工作,所以它也可能是我编码的类型想要变得更好.当然,你没有被聘用去做你以前没做过的事情,所以现在我正在逐步加强.
为此,我从K&R开始,这是一个很好的资源,部分原因是每章都有练习.之后我转到了计算机系统:程序员的视角,然后是Unix环境中的高级编程十章.完成本书后,我将阅读Unix网络编程.
史蒂文斯的书中我缺少的是缺乏编程问题; 它们主要记录功能并提供示例,以及一些章后问题.我觉得,通过挑战每一章a K&R中的知识,我会受益更多.我可以为每个函数编写一些测试程序,但这是一个不太理想的方法,因为(1)我可能没有比上升到一些外部挑战更少的动机,并且(2)我自然只会想到使用该函数以我已经发生过的方式.
所以,我想就如何练习提出一些建议.显然,我的第一选择是找到一些有Unix编程挑战的资源.我也考虑过寻找并尝试为一些开源C项目做出贡献,但这有点令人生畏,因为学习使用该软件会有一些开销,然后学习代码库.我能想到的唯一一个我经常使用的开源C项目是Python,我不确定开始这么容易.
也就是说,我对各种建议持开放态度,因为有些事情我甚至都没有想过.
列出1000多个目录和子目录中文件名的最快方法是什么?
编辑; 我使用的当前代码是:
import java.io.File;
public class DirectoryReader {
static int spc_count=-1;
static void Process(File aFile) {
spc_count++;
String spcs = "";
for (int i = 0; i < spc_count; i++)
spcs += " ";
if(aFile.isFile())
System.out.println(spcs + "[FILE] " + aFile.getName());
else if (aFile.isDirectory()) {
System.out.println(spcs + "[DIR] " + aFile.getName());
File[] listOfFiles = aFile.listFiles();
if(listOfFiles!=null) {
for (int i = 0; i < listOfFiles.length; i++)
Process(listOfFiles[i]);
} else {
System.out.println(spcs + " [ACCESS DENIED]");
}
}
spc_count--;
} …
Run Code Online (Sandbox Code Playgroud) 所有,
下面是我发现很难减少的lambda表达式,即我无法理解如何解决这个问题.
(λmλnλaλb.m(nab)b)(λfx.x)(λfx.fx)
这是我试过的,但我被卡住了:
将上述表达式考虑为:(λm.E)M等于
E = (λnλaλb.m (nab)b)
M =(λfx.x )(λfx.fx)
=>(λnλaλb.(λfx.x)(λfx.fx)(nab)b)
考虑到上述表达式为(λn.E)M等于
E =(λaλb.(λfx.x)(λfx.fx)(nab)b)
M = ??
..而我迷路了!!
任何人都可以帮助我理解,对于任何lambda演算表达式,执行还原的步骤应该是什么?
我在类中有一个静态函数.
每当我尝试使用非静态数据成员时,我都会遇到编译错误.
非静态字段,方法或属性成员需要对象引用
为什么它表现得那样?
空格是Python的意思,因为代码块是由它们的缩进定义的.
此外,Guido van Rossum建议每个缩进级别使用四个空格(参见PEP 8:Python代码样式指南).
在每个缩进级别上不需要四个空格的原因是什么?有技术原因吗?
似乎所有可以用于制作空格定义代码块的参数也可以用于参数来设置一个缩进级别(比如四个空格)的精确空白长度.
什么是二传手和吸气鬼?我为什么需要它们?以有效的方式使用它们的好例子是什么?安装者和吸气剂有什么意义?
更新:我可以获得一些编码示例吗?
为什么大多数编程语言都不支持多继承?
我真的可以使用这个功能来开发不同的应用程序布局吗?