求教, Python 如何把一个二维 list 存入文件,再读成原来的模样?

2016-03-04 21:27:53 +08:00
 yanyuechuixue

楼主不是专业程序员,请见谅。。。

楼主在做科学计算,要把每个“类星体”的一些数据做一些计算,然后按照计算结果把这些类星体分类(分成 8 * 8 的 64 类),我想到的办法是建立了一个二维 list ( 8 * 8 )的,然后计算东西,计算完成后根据其结果把(类星体文件名,计算出的一个文件的属性)放到这个 list 里去。

但由于数据太多,如果用单线程跑的话,可能要跑几个月,所以想把这个任务拆开,而我不会多进程(多线程倒是试过,但是只能 120%左右,提升不大),所以想把这个任务写成多个程序,分开跑,每个程序的这个二维 list 都存成一个文件,都跑完之后再把这个文件合起来。

那么问题来了,我找了一天资料,依然不会把二维 list 存成文件。。。
file.write()只能存放字符串,而我也没找到用 NumPy 创建空的二维数组的函数(虽然一定有)。

所以来求助各位,多谢!

11374 次点击
所在节点    Python
31 条回复
yanyuechuixue
2016-03-05 11:40:12 +08:00
@staticor 同数据民工,我看看去。
imn1
2016-03-05 11:57:41 +08:00
pandas
yanyuechuixue
2016-03-05 12:27:58 +08:00
@20015jjw Spark 好复杂。。。。我不是专业干这个的。。。我是兼职。。。
yuelang85
2016-03-05 14:00:25 +08:00
具体每个元素的数据是什么样呢?

我想说,你这样做的话,就不要用同一个文件,因为有的进程速度快,有的进程速度慢,存取的时候会有顺序问题,而且还有读写安全问题。

我觉得最好的办法是开 64 个进程,存 64 个文件,然后组合成二维数组。

关于写入文件什么内容。楼主可以像上面说的,看下 pickle , pickle 可以把 python 对象序列化成字符串,再反序列化成 python 对象
yanyuechuixue
2016-03-06 00:14:34 +08:00
@kevinyoung 请问,我现在用您的方法,是成功的。
但是我需要先创建一个空的,可以存放("str1",'str2')这样打数据的一个二位数组,该怎么创建?
即创建一个空的数组,可以存放如下结构:
[[('str1','str2'),('str5','str6')],[(str3',('str4'))],[]
[],[],[]
[],[],[]]

我现在的做法是:

Abins=[[[1] for x in range(5)] for y in range(5)]
Abins=np.asarray(Abins,dtype=np.str)
for i in range(2500):
for i in range(2500):
Abins[i][j]=[]
但是并不好使,
In [26]: Abins
Out[26]:
array([], shape=(50, 50, 0),
dtype='|S1')
yanyuechuixue
2016-03-06 00:20:59 +08:00
@seki 首先谢谢,我试了一下您提出的方法,对我来说不是太适用,是这样,我希望创建一个二维的 list ,例如是 8 × 8 的,这样就有 64 个元素,其中这 64 个元素每一个都是一个 list ,我往这 64 个 list 里 append 一个('str1','str2')。

请问这个可以怎么操作?
非常感谢!
glogo
2016-03-06 01:28:50 +08:00
序列化,用 pickle ,性能不够的话考虑 dill
seki
2016-03-06 02:30:49 +08:00
@yanyuechuixue 如果你的长度是固定且相等的话,那么就是创建一个 3d array 然后往里面赋值。如果是变长的或者不等的,那就只能用 list

pickle 在这种情况下是比较好的方法,不管是什么对象,全都塞进去就是了
seki
2016-03-06 02:40:24 +08:00
@yanyuechuixue

import numpy as np
a = np.zeros((8,8,2), dtype=object)
a[0,0,0] = 'hello'


或者
import numpy as np
a = np.zeros((8,8), dtype=object)
a[0,0] = ["hello","world"]
kevinyoung
2016-03-06 10:01:52 +08:00
@yanyuechuixue 你的意思是你的数组是用来存放字符串的元组的是把?

抱歉我一开始意会错了, numpy 虽然也可以处理字符串但并没有什么明显的优势, numpy 适合那种数据量比较大并且都是数字的情况。

我又看了一下你这个问题,如果只是单纯的读写的话,直接用 python 的 list ,然后前面大家提到的用 pickle 或者 json 做序列化都是可以的。

不过我觉得你可能把问题复杂化了,不如你把你要算的具体东西贴上来?不是代码,而是具体的问题,这样大家可以针对你的问题更具体的给一些建议。
yanyuechuixue
2016-03-09 11:49:54 +08:00
@kevinyoung 嗯,我现在用的是 json 进行序列化。具体问题的话,就跟我在主题里说的一样。。。

不是保密,理论物理的科学界不需要保密,只是我只能提取到这种程度了,再说多了也没几个人懂。。。因为再多就是很专业的知识了。。

目前用 json ,算是解决了问题,非常感谢您!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/261191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX