我不知道该怎么称呼,如果mod可以更改标题以更好地反映该问题,请继续。如果您不是mod,请随时评论姓名建议。谢谢 :)

我正在尝试使用Python列表作为HDD创建RAID 5模拟。我已经成功地模拟了RAID 4,其中所有奇偶校验都在一个磁盘上(请参见this CodeReview post)。现在,我正在尝试在所有磁盘上分配奇偶校验。

RAID 4:奇偶校验位于一个磁盘上,RAID 5:奇偶校验已分发

python - 以变​​化的间隔插入列表-LMLPHP
python - 以变​​化的间隔插入列表-LMLPHP

我无法弄清楚如何将奇偶校验正确地插入列表中。

给定字节列表:
b = [104, 101, 121, 32, 116, 104, 101, 114, 101, 32, 66, 111, 98, 98, 121, 33]

我需要它在HDD(hdd[0]-hdd[3])之间平均分配,末尾填充0
hdd[0] = [104, 32, 101, "p", 98, 33 ]
hdd[1] = [101, 116, "p", 32, 98, 0 ]
hdd[2] = [121, "p", 114, 66, 121, "p"]
hdd[3] = ["p", 104, 101, 111, "p", 0 ]

我认为,执行此操作的方法是将"p"插入列表,然后再将列表拆分为HDD。

我不知道该怎么做,因为在它插入一个后,列表会更改,并且在插入第四个"p"之后,它会重置回到第一个位置。

我尝试使用以下(无效)代码随即插入"p"
在此示例中,hdd_num = 4(这是HDD的数量)。

for i, x in enumerate(input_bytes):
    row = i // (hdd_num - 1)
    hdd = hdds[i % hdd_num]
    if hdd[0] == row:
        input_bytes.insert(i+1, "p")
    hdds[i % hdd_num].append(x)

最佳答案

我将采用的方法是将您的代码分成可单独测试和推理的可管理部分。这是一个建议。

def grabChunkOfBytes(byteArray, noChunks):
    chunks = []
    for byte in byteArray:
        chunks.append(byte)
        if len(chunks) == noChunks:
            yield chunks
            chunks = []

    # If the total number of bytes is not divisible by number of disks, 0-fill
    while len(chunks) < noChunks:
        chunks.append(0)
    yield chunks

def computeChecksum(chunks):
    return 'p'  # Your function

def writeChunkToHDDs(chunks, HDDs):
    [hdd.append(part) for hdd, part in zip(HDDs, chunks)]


b = [104, 101, 121, 32, 116, 104, 101, 114, 101, 32, 66, 111, 98, 98, 121, 33, ]
hdds = [[], [], [], []]
totalHDDs = len(hdds)

for i, chunk in enumerate(grabChunkOfBytes(b, totalHDDs - 1)):
    checksum = computeChecksum(chunk)
    chunk.insert(i % totalHDDs, checksum)
    writeChunkToHDDs(chunk, hdds)

from pprint import pprint
pprint(hdds)

关于python - 以变​​化的间隔插入列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44092304/

10-08 23:13